73 struct stackelement *
out) {
78 if (in->varnum != out->varnum) {
79 lt = &(ls->
lifetime[-in->varnum - 1]);
83 #ifdef LV_DEBUG_VERBOSE
84 log_text(
"liveness_join_ss: lifetime for instack not found\n");
90 if (out->varnum >= 0) {
93 lto = &(ls->
lifetime[-out->varnum - 1]);
96 if (lto->
type == -1) {
97 #ifdef LV_DEBUG_VERBOSE
98 log_text(
"liveness_join_ss: lifetime for outstack not found\n");
103 #ifdef LV_DEBUG_CHECK
105 #ifdef LV_DEBUG_VERBOSE
106 log_text(
"liveness_join_ss: in/out stack type mismatch\n");
125 if (ss_last != NULL) {
155 struct stackelement *in, *
i, *
out;
167 in=m->basicblocks[b_index].instack;
173 for (pred = ls->
pred[b_index]; pred != NULL; pred = pred->
next) {
174 out = m->basicblocks[pred->
value].outstack;
175 for (i=in; (i != NULL); i = i->prev, out=out->prev) {
183 int i, icount, b_index;
193 for(i = 0; i < m->basicblockcount; i++) {
196 if (ls->
sorted[i-1] != -1)
197 icount += m->basicblocks[ ls->
sorted[i-1] ].icount;
201 if ((b_index = ls->
sorted[i]) != -1) {
205 src = m->basicblocks[b_index].instack;
207 #ifdef LV_DEBUG_CHECK
209 #ifdef LV_DEBUG_VERBOSE
210 log_text(
"No Incoming Stackslot for Exception/Subroutine BB\n");
219 for (;src != NULL; src=src->
prev) {
232 #ifdef LV_DEBUG_VERBOSE
233 log_text(
"LOCALVAR at basicblock instack\n");
244 src = m->basicblocks[b_index].outstack;
245 for (;src != NULL; src=src->
prev) {
247 #ifdef LV_DEBUG_VERBOSE
248 log_text(
"ARGVAR at basicblock outstack\n");
252 #ifdef LV_DEBUG_VERBOSE
253 log_text(
"LOCALVAR at basicblock outstack\n");
280 for(i = 0; i < m->basicblockcount; i++) {
281 if ((b_index = ls->
sorted[i]) != -1) {
285 lifetimes += m->basicblocks[b_index].indepth;
287 dst = m->basicblocks[b_index].instack;
288 len = m->basicblocks[b_index].icount;
289 iptr = m->basicblocks[b_index].iinstr;
290 for (;len>0; len--, iptr++) {
313 if (( dst != NULL) && (src != dst))
324 lv_sets *sets,
int lifetimes) {
335 src = m->basicblocks[b_index].instack;
337 iindex = m->basicblocks[b_index].icount - 1;
339 iptr = m->basicblocks[b_index].iinstr + iindex;
343 for (;iindex >= 0; iindex--, iptr--) {
351 src=m->basicblocks[b_index].instack;
373 if (op_needs_saved[iptr->
opc])
390 src = m->basicblocks[b_index].instack;
395 for (;src != NULL; src=src->
prev) {
419 #ifdef LV_DEBUG_CHECK
451 visited =
bv_new(m->basicblockcount);
456 for(i = 0; i < m->basicblockcount; i++) {
467 if (rd->locals[i][t].type >= 0)
477 W =
wl_new(m->basicblockcount);
478 for (i = 0; i < m->basicblockcount; i++)
487 for (succ = ls->
succ[b_index]; succ != NULL; succ = succ->
next)
503 for(pred = ls->
pred[b_index]; pred != NULL; pred = pred->
next)
508 #ifdef LV_DEBUG_CHECK
509 s = m->basicblocks[b_index].instack;
512 for( ; s != NULL; s = s->
prev) {
513 #ifdef LV_DEBUG_VERBOSE
515 log_text(
"liveness: Error In Stacklot not live!\n");
522 for (i = 0; i < m->basicblockcount; i++)
523 if ((b_index=ls->
sorted[i]) != -1) {
528 if (p < ls->
lifetime[t].i_first_def)
547 #ifdef LV_DEBUG_VERBOSE
644 iptr = m->basicblocks[b_index].iinstr + iindex;
663 case ICMD_INLINE_GOTO:
void liveness_add_ss(struct lifetime *lt, stackelement_t *s)
struct lifetime * liveness_get_ss_lifetime(lsradata *ls, stackelement_t *s)
struct lifetime * lifetime
bool bv_get_bit(bitvector bv, int bit)
#define IS_2_WORD_TYPE(a)
void bv_union(bitvector d, bitvector s1, bitvector s2, int size)
void liveness_scan_registers_canditates(jitdata *jd, int b_index, int iindex, stackelement_t *src, lv_sets *sets)
void liveness_setup(jitdata *jd)
void liveness_scan_basicblock(jitdata *jd, int b_index, lv_sets *sets, int lifetimes)
void exceptions_throw_internalerror(const char *message,...)
void liveness(jitdata *jd)
bool wl_is_empty(worklist *w)
void bv_reset(bitvector bv, int size)
void liveness_set_local(lsradata *ls, int block, int g_iindex, s4 v_index, int type, lv_sets *sets, int op)
void bv_copy(bitvector dst, bitvector src, int size)
void liveness_init(jitdata *jd)
#define INSTRUCTION_GET_METHODDESC(iptr, md)
worklist * wl_new(int size)
void wl_add(worklist *w, int element)
void liveness_set_stack(lsradata *ls, int block, int g_iindex, stackelement_t *s, lv_sets *sets, int op)
void liveness_join_lifetimes(jitdata *jd, int b_index)
struct stackslot * local_ss
void liveness_join_ss(struct lsradata *ls, struct stackelement *in, struct stackelement *out)
bitvector bv_new(int size)
void bv_set_bit(bitvector bv, int bit)
void bv_minus(bitvector d, bitvector s1, bitvector s2, int size)
bool bv_equal(bitvector s1, bitvector s2, int size)