41 #if defined(ENABLE_ESCAPE_REASON)
45 #if defined(ENABLE_REASON)
46 #define I2(why, tov, es) escape_analysis_record_reason(e, why, iptr, tov, es);
48 #define I2(why, tov, es)
50 #define I(why, to, from) I2(why, instruction_ ## to (iptr), escape_analysis_get_state(e, instruction_ ## from (iptr)))
51 #define E2(why, var) I2(why, var, ESCAPE_GLOBAL)
52 #define E(why, which) E2(why, instruction_ ## which (iptr))
68 #if defined(ENABLE_COLOR)
76 #if defined(ENABLE_COLOR)
95 # define str(x) case x: return #x;
96 switch (escape_state) {
102 default:
return "???";
111 return iptr->
sx.
s23.s3.bte->opcode;
123 return iptr->
sx.
s23.s3.uf->fieldref->parseddesc.fd->type;
125 return iptr->
sx.
s23.s3.fmiref->p.field->type;
134 return iptr->
sx.
s23.s2.varindex;
138 return iptr->
sx.
s23.s3.varindex;
161 return iptr->
sx.
s23.s3.fmiref->p.method;
205 #define FOR_EACH_INSTRUCTION_LIST(list, it) \
206 for ((it) = (list)->first; (it) != NULL; (it) = (it)->next)
263 storen = store->
sx.
s23.s3.uf->fieldref->name;
264 loadn = load->
sx.
s23.s3.uf->fieldref->name;
266 storen = store->
sx.
s23.s3.fmiref->name;
267 loadn = load->
sx.
s23.s3.fmiref->name;
270 return storen == loadn;
305 if (dl->
first == NULL) {
320 if (dl->
first == NULL) {
332 #define FOR_EACH_DEPENDENCY_LIST(dl, it) \
333 for ((it) = (dl)->first; (it) != NULL; (it) = (it)->next)
337 #if defined(ENABLE_REASON)
338 typedef struct reason {
353 #if defined(ENABLE_REASON)
366 #if defined(ENABLE_REASON)
378 assert(0 <= var && var <= e->jd->vartop);
400 assert(ctr++ < 10000);
465 e->
verbose = getenv(
"EV") != NULL;
468 #if defined(ENABLE_REASON)
478 re->next = ve->reasons;
481 printf(
"%d escapes because %s\n", var, why);
545 "escape state of %d %s => %s\n",
631 if (e->
verbose && has_become_arg)
printf(
"(%d,%d) has become arg.\n", var1, var2);
669 #if defined(ENABLE_REASON)
671 reason_t *re = ve1->reasons;
672 while (re->next != NULL) {
675 re->next = ve2->reasons;
677 ve1->reasons = ve2->reasons;
691 printf(
"dependency_list_add: %d.dependency_list.add( { ", obj);
731 E(
"unresolved class", dst)
756 E(
"untracked array", dst)
773 E(
"putfield into argument",
s2)
775 I(
"putfield inherit",
s2,
s1);
786 E(
"aastore into argument",
s3)
798 E(
"loaded from static var", dst)
812 E(
"loaded from arg", dst)
832 E(
"aaload from argument", dst)
879 paramescape = mi->paramescape;
883 printf(
"Paramescape for callee available.\n");
887 if (paramescape) why =
"Available param escape";
889 if (paramescape == NULL) {
891 printf(
"BC escape analyzing callee.\n");
893 why =
"BC param escape";
895 paramescape = mi->paramescape;
899 printf(
"Unresolved callee.\n");
901 why =
"Unresolved callee";
907 printf(
"Not monomorphic.\n");
919 if (paramescape == NULL) {
930 for (i = 0; i < count; ++
i) {
933 if (paramescape == NULL) {
950 if (*paramescape & 0x80) {
963 if (paramescape != NULL) {
997 iarg = iptr->
sx.
s23.s2.iargs;
1021 for (iptr = bptr->phis; iptr != bptr->phis + bptr->phicount; ++iptr) {
1043 E(
"return of not argument",
s1)
1096 printf(
"Monitor on thread local object!\n");
1110 #if defined(ENABLE_REASON)
1115 iptr->escape_reasons = ve->reasons;
1117 assert(!ve->reasons);
1118 reason_t *r =
NEW(reason_t);
1119 r->why =
"No escape\n";
1122 iptr->escape_reasons = r;
1124 assert(iptr->escape_reasons);
1150 for (p = 0, l = 0; p < md->
paramcount; ++p) {
1184 e->
jd->
m->paramescape = paramescape + ret_val_is_adr;
1186 for (p = 0, l = 0; p < md->
paramcount; ++p) {
1198 printf(
"non-escaping adr parameter returned: %d\n", p);
1210 if (ret_val_is_adr) {
1229 #if defined(ENABLE_REASON)
1230 void print_escape_reasons() {
1233 fprintf(stderr,
"DYN_REASON");
1235 for (; re; re = re->next) {
1236 fprintf(stderr,
":%s", re->why);
1239 fprintf(stderr,
"\n");
1242 void set_escape_reasons(
void *vp) {
1260 "%s@%d: --%s-- %d\n\n",
1266 #if defined(ENABLE_REASON)
1269 for (re = ve->reasons; re; re = re->next) {
1270 printf(
"ESCAPE_REASON: %s\n", re->why);
1298 for (i = 0; i < jd->
vartop; ++
i) {
1301 printf(
"EES of %d: ", i);
1302 for (j = 0; j < jd->
vartop; ++j) {
bool dependency_list_item_compare(const dependency_list_item_t *item, const instruction *load)
static s4 instruction_arg_type(const instruction *iptr, int arg)
static void escape_analysis_display(escape_analysis_t *e)
struct dependency_list_item * next
static void var_extra_set_escape_state(escape_analysis_t *e, s4 var, escape_state_t escape_state)
static bool instruction_is_class_constant(const instruction *iptr)
struct instruction_list_item * next
static void escape_analysis_process_arguments(escape_analysis_t *e)
void dependency_list_add(dependency_list_t *dl, instruction *store)
static void escape_analysis_init(escape_analysis_t *e, jitdata *jd)
static s4 instruction_arg(const instruction *iptr, int arg)
static s4 instruction_s3(const instruction *iptr)
static void escape_analysis_process_instructions(escape_analysis_t *e)
static int instruction_arg_count(const instruction *iptr)
void dependenCy_list_import(dependency_list_t *dl, dependency_list_t *other)
struct instruction_list_item instruction_list_item_t
static escape_state_t escape_analysis_get_state(escape_analysis_t *e, s4 var)
static s4 var_extra_get_representant(escape_analysis_t *e, s4 var)
static escape_state_t var_extra_get_escape_state(escape_analysis_t *e, s4 var)
struct dependency_list_item dependency_list_item_t
static var_extra_t * var_extra_get(escape_analysis_t *e, s4 var)
instruction_list_item_t * first
const char * escape_state_to_string(escape_state_t escape_state)
s4 dependency_list_item_get_dependency(const dependency_list_item_t *item)
void escape_analysis_perform(jitdata *jd)
instruction_list_t * returns
static void escape_analysis_set_allocation(escape_analysis_t *e, s4 var, instruction *iptr)
static bool escape_analysis_in_same_set(escape_analysis_t *e, s4 var1, s4 var2)
static void escape_analysis_mark_monitors(escape_analysis_t *e)
dependency_list_item_t * last
static void escape_analysis_post_process_returns(escape_analysis_t *e)
instruction_list_t * allocations
void instruction_list_add(instruction_list_t *list, instruction *instr)
#define MZERO(ptr, type, num)
static bool instruction_is_unresolved(const instruction *iptr)
bool escape_is_monomorphic(methodinfo *caller, methodinfo *callee)
methoddesc * instruction_call_site(const instruction *iptr)
dependency_list_item_t * first
#define IS_2_WORD_TYPE(a)
static s4 instruction_dst(const instruction *iptr)
static bool escape_analysis_get_contains_only_arguments(escape_analysis_t *e, s4 var)
static s4 instruction_s1(const instruction *iptr)
builtintable_entry * builtintable_get_internal(functionptr fp)
static methodinfo * instruction_local_methodinfo(const instruction *iptr)
#define FOR_EACH_DEPENDENCY_LIST(dl, it)
static void escape_analysis_process_instruction(escape_analysis_t *e, instruction *iptr)
void escape_analysis_escape_check(void *vp)
static var_extra_t * var_extra_get_no_alloc(const escape_analysis_t *e, s4 var)
static int instruction_dst_type(const instruction *iptr, jitdata *jd)
static u1 escape_state_to_u1(escape_state_t x)
#define FOR_EACH_BASICBLOCK(jd, it)
static void escape_analysis_set_contains_only_arguments(escape_analysis_t *e, s4 var)
static bool escape_analysis_get_contains_argument(escape_analysis_t *e, s4 var)
union instruction::@12 sx
static void escape_analysis_export_arguments(escape_analysis_t *e)
static int instruction_return_type(const instruction *iptr)
icmdtable_entry_t icmd_table[256]
static s2 instruction_get_opcode(const instruction *iptr)
static dependency_list_t * var_extra_get_dependency_list(escape_analysis_t *e, s4 var)
instruction_list_t * monitors
byte_iterator begin() const
void show_icmd(jitdata *jd, instruction *iptr, bool deadcode, int stage)
static classinfo * escape_analysis_classinfo_in_var(escape_analysis_t *e, s4 var)
static escape_state_t escape_state_from_u1(u1 x)
static void escape_analysis_mark_allocations(escape_analysis_t *e)
static void color_start(color_t color)
struct var_extra var_extra_t
static void escape_analysis_set_contains_argument(escape_analysis_t *e, s4 var)
static s4 instruction_field_type(const instruction *iptr)
static void escape_analysis_post_process_getfields(escape_analysis_t *e)
#define FOR_EACH_INSTRUCTION(bptr, it)
static void escape_analysis_merge(escape_analysis_t *e, s4 var1, s4 var2)
void bc_escape_analysis_perform(methodinfo *m)
static s4 instruction_s2(const instruction *iptr)
struct instruction::@12::@13 s23
static void escape_analysis_add_dependency(escape_analysis_t *e, instruction *store)
static java_object_t * next
static instruction * escape_analysis_get_allocation(const escape_analysis_t *e, s4 var)
void method_add_assumption_monomorphic(methodinfo *m, methodinfo *caller)
static void escape_analysis_ensure_state(escape_analysis_t *e, s4 var, escape_state_t escape_state)
void instruction_list_init(instruction_list_t *list)
static classinfo * instruction_classinfo(const instruction *iptr)
#define FOR_EACH_INSTRUCTION_LIST(list, it)
static void var_extra_init(var_extra_t *ve)
instruction_list_t * getfields
void dependency_list_init(dependency_list_t *dl)
static void color_printf(color_t color, const char *fmt,...)