84 #ifdef LSRA_DEBUG_VERBOSE
103 #if defined(ENABLE_STATISTICS)
108 #if defined(LSRA_DEBUG_CHECK)
115 #if defined(LSRA_DEBUG_CHECK)
118 while (b_index < m->basicblockcount ) {
122 in=m->basicblocks[b_index].instack;
123 ind=m->basicblocks[b_index].indepth;
124 for (;ind != 0;in=in->
prev, ind--) {
131 out=m->basicblocks[b_index].outstack;
132 outd=m->basicblocks[b_index].outdepth;
133 for (;outd != 0;out=out->
prev, outd--) {
135 {
log_text(
"ARGVAR in outstack\n"); assert(0); }
137 {
log_text(
"LOCALVAR in outstack\n"); assert(0); }
148 #if defined(ENABLE_STATISTICS)
153 for (locals_start = ls->
lifetimecount-1; (locals_start >=0) &&
162 count_locals_conflicts += 2;
190 stack =
DMNEW(
int, m->basicblockcount + 1);
191 visited = (
int *)
DMNEW(
int, m->basicblockcount + 1);
192 for (i = 0; i <= m->basicblockcount; i++) {
204 while (not_finished) {
205 while (stack_top != 0) {
207 i = stack[stack_top];
210 for (succ = ls->
succ[i]; succ != NULL; succ = succ->
next) {
211 visited[succ->
value]++;
215 stack[stack_top] = succ->
value;
220 not_finished =
false;
221 for (i=1; i <= m->basicblockcount; i++) {
224 if ((visited[i] != 0) && (visited[
i] < ls->
num_pred[
i])) {
225 stack[stack_top] =
i;
246 for(i=0; i < basicblockcount; i++) {
253 n->
next = _backedges;
261 for (n=_backedges, i=0; n != NULL; n=n->
next, i++) {
276 for (i=0; i <= m->basicblockcount; i++)
302 while ( (i < m->basicblockcount + 1) ) {
303 if (j < ls->backedge_count) {
304 while ( i < ls->backedge[j]->end ) {
323 #ifdef LSRA_DEBUG_VERBOSE
328 printf(
"Nesting Level \n");
329 for (i=0; i<m->basicblockcount; i++)
printf(
" %3li", ls->
nesting[i]);
333 for (i=0; i <= m->basicblockcount; i++) {
352 for (i=0; i < m->basicblockcount; i++) {
353 for (next=&(ls->
succ[i]); *next != NULL; next=&((*next)->next)) {
354 if ( (*next)->value == m->basicblockcount ) {
356 *next = (*next)->
next;
357 if (*next == NULL)
break;
360 for (next=&(ls->
pred[i]); *next != NULL; next=&((*next)->next)) {
361 if ( (*next)->value == m->basicblockcount ) {
363 *next = (*next)->
next;
364 if (*next == NULL)
break;
368 if (ls->
sorted[i] == m->basicblockcount) j=
i;
373 for (i=j+1; i <= m->basicblockcount; i++) {
378 for (i=0; i < m->basicblockcount; i++)
394 #ifdef LSRA_DEBUG_VERBOSE
398 printf(
"Backedge: %i - %i, %i - %i\n",
402 printf(
"Nesting Level \n");
403 for (i=0; i<m->basicblockcount; i++)
printf(
" %3li", ls->
nesting[i]);
427 #ifdef LSRA_DEBUG_VERBOSE
432 printf(
"Backedge: %i - %i, %i - %i\n",
453 #ifdef LSRA_DEBUG_VERBOSE
457 printf(
"Backedge: %i - %i, %i - %i\n",
479 for (n=ls->
succ[from]; (n!= NULL) && (n->
value != to); n=n->
next);
480 if (n != NULL)
return;
511 #ifdef LSRA_DEBUG_VERBOSE
516 for (; ex != NULL; ex = ex->down) {
518 #ifdef LSRA_DEBUG_VERBOSE
520 printf(
"[%i-%i]->%i ",ex->start->nr, ex->end->nr,
522 if (ex->handler->nr >= m->basicblockcount) {
523 log_text(
"Exceptionhandler Basicblocknummer invalid\n");
527 log_text(
"Exceptionhandler Basicblocknummer not reachable\n");
530 if (ex->start->nr > ex->end->nr) {
531 log_text(
"Guarded Area starts after its end\n");
538 for (i=ex->start->nr; (i <= ex->end->nr) &&
539 (i < m->basicblockcount); i++)
543 #ifdef LSRA_DEBUG_VERBOSE
553 struct _sbr *sbr, *n;
565 #ifdef LSRA_DEBUG_CHECK
566 if (to == m->basicblockcount)
567 {
log_text(
"Invalid subroutine start index\n"); assert(0); }
573 for (from++; (from < m->basicblockcount) &&
575 #ifdef LSRA_DEBUG_CHECK
576 if (from == m->basicblockcount)
577 {
log_text(
"Invalid return basic block index for jsr\n"); assert(0); }
620 if (b_index != m->basicblockcount) {
621 visited[b_index] =
true;
626 if (!next_block && !(m->basicblocks[b_index].icount))
630 ip = m->basicblocks[b_index].iinstr
631 + m->basicblocks[b_index].icount -1;
640 for (l = ret; l != NULL; l = l->
next)
643 for ( l = ls->
succ[b_index]; l != NULL; l = l->
next)
644 if (!visited[l->
value])
648 if (!visited[b_index + 1])
661 #ifdef LSRA_DEBUG_VERBOSE
668 visited = (
bool *)
DMNEW(
int, m->basicblockcount + 1);
669 for (i=0; i <= m->basicblockcount; i++) visited[i] =
false;
670 for (sbr = ls->
sbr.
next; sbr != NULL; sbr=sbr->
next) {
672 #ifdef LSRA_DEBUG_VERBOSE
674 printf(
"Subroutine Header: %3i Return Adresses:",sbr->
header);
675 for (ret = sbr->
ret; ret != NULL; ret = ret->
next)
692 int high, low, count;
699 while (b_index < m->basicblockcount ) {
701 (len = m->basicblocks[b_index].icount)) {
705 ip = m->basicblocks[b_index].iinstr +
706 m->basicblocks[b_index].icount -1;
767 count = (high-low+1);
769 while (--count >= 0) {
772 m->basicblockindex[*s4ptr]);
784 while (--count >= 0) {
786 m->basicblockindex[s4ptr[1]]);
826 for (i=0; i<m->basicblockcount; i++) {
834 ls->
pred[m->basicblockcount]=NULL;
835 ls->
succ[m->basicblockcount]=NULL;
836 ls->
sorted[m->basicblockcount]=-1;
850 #ifdef LSRA_DEBUG_VERBOSE
867 #if defined(ENABLE_LOOP)
871 log_text(
"lsra not possible with loop optimization\n");
887 #ifdef LSRA_DEBUG_VERBOSE
890 for (i=0; i < m->basicblockcount; i++) {
892 for (nl=ls->
succ[i]; nl!= NULL; nl=nl->
next)
896 printf(
"Predecessors:\n");
897 for (i=0; i < m->basicblockcount; i++) {
899 for (nl=ls->
pred[i]; nl!= NULL; nl=nl->
next)
904 for (i=0; i < m->basicblockcount; i++)
printf(
"%3i ", ls->
sorted[i]);
939 for (i=0; i < m->basicblockcount; i++) {
941 for (nl=ls->
succ[i]; nl!= NULL; nl=nl->
next)
945 printf(
"Predecessors:\n");
946 for (i=0; i < m->basicblockcount; i++) {
948 for (nl=ls->
pred[i]; nl!= NULL; nl=nl->
next)
953 for (i=0; i < m->basicblockcount; i++)
printf(
"%3i ", ls->
sorted[i]);
962 #ifdef LSRA_DEBUG_CHECK
965 bptr = m->basicblocks;
966 while (bptr != NULL) {
967 if (i > m->basicblockcount){
968 {
log_text(
"linked bb list does not correspond with bb array(1)\n");
971 if (bptr != &(m->basicblocks[i])){
972 {
log_text(
"linked bb list does not correspond with bb array(2)\n");
979 if (i<m->basicblockcount){
980 {
log_text(
"linked bb list does not correspond with bb array(3)\n");
996 for (i=m->basicblockcount-1; i >= 0; i--) {
997 if (ls->
sorted[i] != -1) {
1011 for (p = 0, i = 0; p < md->
paramcount; p++) {
1014 if (rd->locals[i][t].type >= 0)
1028 #ifdef LSRA_DEBUG_VERBOSE
1030 printf(
"Basicblockcount: %4i\n",m->basicblockcount);
1037 int i, j, iarg, farg;
1040 bool *fltarg_used, *intarg_used;
1071 intarg_used[i]=
false;
1075 fltarg_used[i]=
false;
1083 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1085 int_reg->
sav_reg[--int_sav_top] =
1089 int_reg->
sav_reg[--int_sav_top] =
1096 int_reg->
sav_reg[--int_sav_top] =
1102 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
1107 flt_reg->
sav_reg[--flt_sav_top] =
1119 if (!intarg_used[i])
1120 int_reg->
sav_reg[--int_sav_top]=rd->argintregs[
i];
1122 if (!fltarg_used[i])
1123 flt_reg->
sav_reg[--flt_sav_top]=rd->argfltregs[
i];
1135 int argintreguse, argfltreguse;
1163 int_reg->
tmp_reg[i]=rd->argintregs[j];
1167 flt_reg->
tmp_reg[i]=rd->argfltregs[j];
1181 for (i=lo+1; i<=hi; i++) {
1199 x = ls->
lifetime[a[(lo+hi)/2]].i_start;
1228 for (param_count=0; (param_count < lifetime_count) &&
1231 if (param_count > 0) {
1233 for (i=0; i < param_count -1; i++)
1234 for (j=i+1; j < param_count; j++)
1239 lifetime[
i]=lifetime[j];
1246 #ifdef LSRA_DEBUG_VERBOSE
1254 #if defined(__I386__)
1263 lsra_qsort( ls, ls->lt_mem, 0, ls->lt_mem_count - 1);
1264 lsra_qsort( ls, ls->lt_int, 0, ls->lt_int_count - 1);
1265 lsra_qsort( ls, ls->lt_flt, 0, ls->lt_flt_count - 1);
1271 #ifdef LSRA_DEBUG_VERBOSE
1274 for (i=0; i<int_reg.
sav_top; i++)
1276 printf(
"\nINTTMP REG: ");
1277 for (i=0; i<int_reg.
tmp_top; i++)
1279 printf(
"\nFLTSAV REG: ");
1280 for (i=0; i<flt_reg.
sav_top; i++)
1282 printf(
"\nFLTTMP REG: ");
1283 for (i=0; i<flt_reg.
tmp_top; i++)
1292 _lsra_main(jd, ls->lt_int, ls->lt_int_count, &int_reg, &lsra_reg_use);
1298 _lsra_main(jd, ls->lt_flt, ls->lt_flt_count, &flt_reg, &lsra_reg_use);
1305 #if defined(__I386__)
1313 lsra_mem_use = rd->
memuse;
1315 lsra_alloc(jd, ls->lt_mem, ls->lt_mem_count, &lsra_mem_use);
1316 lsra_alloc(jd, ls->lt_int, ls->lt_int_count, &lsra_mem_use);
1317 lsra_alloc(jd, ls->lt_flt, ls->lt_flt_count, &lsra_mem_use);
1321 #ifdef LSRA_DEBUG_VERBOSE
1323 printf(
"Int RA complete \n");
1324 printf(
"Lifetimes after splitting int: \n");
1327 printf(
"Flt RA complete \n");
1328 printf(
"Lifetimes after splitting flt:\n");
1331 printf(
"Rest RA complete \n");
1332 printf(
"Lifetimes after leftt:\n");
1355 for (lt_index = 0; lt_index < lifetimecount; lt_index ++) {
1356 lt = &(ls->
lifetime[lifet[lt_index]]);
1360 if (lt->
reg == -1) {
1371 n->
s->regoff = regoff;
1374 if (rd->locals[lt->
v_index][lt->
type].type >= 0) {
1376 rd->locals[lt->
v_index][lt->
type].regoff = regoff;
1391 *flags &= ~INMEMORY;
1442 #if !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1448 for (lt_index = 0; lt_index < lifetimecount; lt_index++)
1456 for (lt_index = 0; lt_index < lifetimecount; lt_index++) {
1457 lt = &(ls->
lifetime[lifet[lt_index]]);
1459 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1468 if (reg->
sav_top > regsneeded) {
1469 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1479 if (reg->
tmp_top > regsneeded) {
1481 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1490 if (reg->
sav_top > regsneeded) {
1492 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1501 if (reg_index == -1)
1504 lt->
reg = reg_index;
1520 for(i = 0; (i < *active_top) && (active[i]->i_end < lt->
i_end); i++);
1521 for(j = *active_top; j >
i; j--) active[j] = active[j-1];
1530 &(jd->ls->active_tmp_top));
1532 &(jd->ls->active_sav_top));
1537 struct lifetime **active,
int *active_top)
1541 for(i = 0; i < *active_top; i++) {
1548 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1557 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1580 for(k = 0, j = i; (j < *active_top); k++,j++)
1581 active[k] = active[j];
1593 if (lt->
reg == -1) {
1595 &(jd->ls->active_sav_top));
1604 #ifdef USAGE_COUNT_EXACT
1608 if (*active_top == 0) {
1613 i = *active_top - 1;
1614 #if defined(USAGE_COUNT_EXACT)
1619 for (; (i >= 0) && (active[i]->
i_end >= lt->
i_end); i--) {
1629 # if defined(USAGE_COUNT) && !defined(USAGE_COUNT_EXACT)
1637 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1646 for (j = i; j < *active_top; j++)
1647 active[j] = active[j + 1];
1660 #if defined(LSRA_DEBUG_VERBOSE) || !defined(LV)
1674 #ifdef LSRA_DEBUG_VERBOSE
1676 printf(
"icount_block: ");
1677 for (i=0; i < m->basicblockcount; i++)
1688 for(lt_index = 0 ;lt_index < ls->
lifetimecount; lt_index++) {
1691 ls->
lt_used[lifetimecount++] = lt_index;
1693 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1719 #if defined(__I386__)
1729 {
log_text(
"Unknown Type\n"); assert(0); }
1746 #ifdef LSRA_DEBUG_VERBOSE
1747 printf(
"Warning: var not defined! vi: %i start: %i end: %i\n",
1757 #ifdef LSRA_DEBUG_VERBOSE
1758 printf(
"Warning: Var not used! vi: %i start: %i end: %i\n",
1767 #ifdef LSRA_DEBUG_VERBOSE
1795 #ifdef USAGE_PER_INSTR
1803 #ifdef LSRA_DEBUG_VERBOSE
1816 for (lt_index = 0; lt_index < lifetimecount; lt_index++) {
1834 {
log_text(
"Type Data mismatch 3\n"); assert(0); }
1837 printf(
"i_Start: %3i(%3i,%3i) i_stop: %3i(%3i,%3i) reg: %3i VI: %3i type: %3i flags: %3i varkind: %3i usage: %3li ltflags: %xi \n",n->
i_start, ls->
sorted[n->
bb_first_def], n->
i_first_def,n->
i_end, ls->
sorted[n->
bb_last_use], n->
i_last_use,regoff,n->
v_index,type,flags, varkind, n->
usagecount, n->
flags);
1839 printf(
"i_Start: %3i i_stop: %3i reg: %3i VI: %3i type: %3i flags: %3i varkind: %3i usage: %3li ltflags: %xi \n",n->
i_start, n->
i_end, regoff,n->
v_index,type,flags, varkind, n->
usagecount, n->
flags);
1842 printf(
"%3i Lifetimes printed \n",lt_index);
1854 struct stackelement *
out,
int join_flag) {
1859 if (in->varnum != out->varnum) {
1860 lt = &(ls->
lifetime[-in->varnum - 1]);
1862 #ifdef LSRA_DEBUG_CHECK
1864 if (lt->
type == -1) {
1865 log_text(
"lsra_join_ss: lifetime for instack not found\n");
1870 if (out->varnum >= 0) {
1873 lto = &(ls->
lifetime[-out->varnum - 1]);
1882 #ifdef LSRA_DEBUG_CHECK
1883 if (lto->
type == -1) {
1884 log_text(
"lsra_join_ss: lifetime for outstack not found\n");
1888 #ifdef LSRA_DEBUG_CHECK
1890 log_text(
"lsra_join_ss: in/out stack type mismatch\n");
1903 while (ss != NULL) {
1908 if (ss_last != NULL) {
1933 struct stackelement *in, *
i, *
out;
1942 in=m->basicblocks[b_index].instack;
1948 for (pred = ls->
pred[b_index]; pred != NULL; pred = pred->
next) {
1949 out = m->basicblocks[pred->
value].outstack;
1950 for (i=in; (i != NULL); i = i->prev, out=out->prev) {
1988 #ifdef LSRA_DEBUG_CHECK_VERBOSE
2015 #define IS_TEMP_VAR(s) (((s)->varkind != ARGVAR) && ((s)->varkind != LOCALVAR))
2017 #define lsra_join_3_stack(ls, dst, src1, src2, join_type) \
2018 if ( IS_TEMP_VAR(dst) ) { \
2020 if ( IS_TEMP_VAR(src1) && ((src1)->type == (dst)->type)) { \
2021 join_ret = lsra_join_ss(ls, dst, src1, join_type); \
2023 if ((!join_ret) && IS_TEMP_VAR(src2) && ((src2)->type == (dst)->type)) { \
2024 lsra_join_ss(ls, dst, src2, join_type); \
2028 #define lsra_join_2_stack(ls, dst, src, join_type) \
2029 if ( IS_TEMP_VAR(dst) ) { \
2030 if ( (IS_TEMP_VAR(src)) && ((src)->type == (dst)->type)) { \
2031 lsra_join_ss(ls, dst, src, join_type); \
2035 #define lsra_join_dup(ls, s1, s2, s3) { \
2036 if (IS_TEMP_VAR(s1)) { \
2038 if (IS_TEMP_VAR(s2)) \
2039 join_ret = lsra_join_ss(ls, s1, s2, JOIN); \
2041 if (IS_TEMP_VAR(s3)) { \
2044 lsra_join_ss(ls, s1, s3, JOIN_DUP); \
2046 lsra_join_ss(ls, s1, s3, JOIN); \
2050 if (IS_TEMP_VAR(s2) && IS_TEMP_VAR(s3)) \
2051 lsra_join_ss(ls, s2, s3, JOIN_DUP); \
2054 #define lsra_new_stack(ls, s, block, instr) \
2055 if ((s)->varkind != ARGVAR) _lsra_new_stack(ls, s, block, instr, LSRA_STORE)
2076 #define lsra_from_stack(ls, s, block, instr) \
2077 if ((s)->varkind != ARGVAR) _lsra_from_stack(ls, s, block, instr, LSRA_LOAD)
2078 #define lsra_pop_from_stack(ls, s, block, instr) \
2079 if ((s)->varkind != ARGVAR) _lsra_from_stack(ls, s, block, instr, LSRA_POP)
2114 if (n->
type == -1) {
2143 #ifdef LSRA_DEBUG_VERBOSE
2147 printf(
"%p(R%3i N%3i K%3i T%3i F%3i) ",(
void *)s,s->regoff, s->
varnum,
2176 iindex = m->basicblocks[b_index].icount - 1;
2178 src = m->basicblocks[b_index].instack;
2183 for (;src != NULL; src=src->
prev) {
2189 src = m->basicblocks[b_index].outstack;
2190 for (;src != NULL; src=src->
prev) {
2195 iptr = m->basicblocks[b_index].iinstr + iindex;
2197 for (;iindex >= 0; iindex--, iptr--) {
2210 src=m->basicblocks[b_index].instack;
2231 case ICMD_INLINE_GOTO:
2419 #ifdef JOIN_DUP_STACK
2432 #ifdef JOIN_DUP_STACK
2447 #ifdef JOIN_DUP_STACK
2463 #ifdef JOIN_DUP_STACK
2481 #ifdef JOIN_DUP_STACK
2503 #ifdef JOIN_DUP_STACK
2562 #ifdef JOIN_DEST_STACK
2571 #ifdef JOIN_DEST_STACK
2653 #ifdef JOIN_DEST_STACK
void lsra_add_cfg(jitdata *jd, int from, int to)
void lsra_add_ss(struct lifetime *, stackelement_t *)
struct _backedge ** backedge
void lsra_make_cfg(jitdata *jd)
#define STATISTICS(x)
Wrapper for statistics only code.
#define lsra_join_dup(ls, s1, s2, s3)
exception_entry * exceptiontable
#define IS_INT_LNG_TYPE(a)
void lsra_calc_lifetime_length(jitdata *)
void lsra_add_sub(jitdata *jd, int b_index, struct _list *ret, bool *visited)
void lsra_setup(jitdata *)
void lsra_alloc(jitdata *, int *, int, int *)
void lsra_qsort(struct lsradata *ls, int *a, int lo, int hi)
void _spill_at_intervall(struct lifetime *, struct lifetime **, int *)
#define lsra_pop_from_stack(ls, s, block, instr)
struct stackslot * lsra_make_ss(stackelement_t *s, int bb_index)
struct lifetime * lifetime
void lsra_DFS(jitdata *jd)
void lsra_get_backedges_(lsradata *ls, int basicblockcount)
#define lsra_new_stack(ls, s, block, instr)
void lsra_reg_setup(jitdata *, struct lsra_register *, struct lsra_register *)
#define lsra_join_2_stack(ls, dst, src, join_type)
void lsra_main(jitdata *)
void lsra_add_jsr(jitdata *jd, int from, int to)
static int code_is_leafmethod(codeinfo *code)
struct freemem * lsra_getnewmem(int *)
void lsra_init(jitdata *)
#define IS_2_WORD_TYPE(a)
void spill_at_intervall(jitdata *, struct lifetime *)
void lsra_add_active(struct lifetime *, struct lifetime **, int *)
struct lifetime ** active_sav
void lsra_setflags(int *, int)
void _lsra_from_stack(lsradata *, stackelement_t *, int, int, int)
Instruction::InstID tmp[]
void liveness_setup(jitdata *jd)
alloc::list< PassInfo::IDTy >::type & stack
This file contains the statistics framework.
void lsra_param_sort(struct lsradata *ls, int *lifetime, int lifetime_count)
void exceptions_throw_internalerror(const char *message,...)
void lsra_get_backedges(jitdata *jd)
int lsra_getmem(struct lifetime *, struct freemem *, int *)
void liveness(jitdata *jd)
void lsra_usage_local(lsradata *, s4, int, int, int, int)
struct lifetime * get_ss_lifetime(lsradata *ls, stackelement_t *s)
#define lsra_join_3_stack(ls, dst, src1, src2, join_type)
void lsra_dump_stack(stackelement_t *)
void _lsra_main(jitdata *, int *, int, struct lsra_register *, int *)
void lsra_add_subs(jitdata *jd)
#define PACK_REGS(low, high)
void liveness_init(jitdata *jd)
void _lsra_expire_old_intervalls(jitdata *, struct lifetime *, struct lsra_register *, struct lifetime **, int *)
#define INSTRUCTION_GET_METHODDESC(iptr, md)
#define lsra_from_stack(ls, s, block, instr)
void lsra_get_nesting(jitdata *jd)
void lsra_add_exceptions(jitdata *jd)
void lsra_insertion_sort(struct lsradata *ls, int *a, int lo, int hi)
static int code_is_synchronized(codeinfo *code)
bool lsra_join_ss(struct lsradata *ls, struct stackelement *in, struct stackelement *out, int join_flag)
void print_lifetimes(jitdata *, int *, int)
#define LSRA_DEBUG_VERBOSE
void lsra_expire_old_intervalls(jitdata *, struct lifetime *, struct lsra_register *)
static java_object_t * next
struct stackslot * local_ss
struct lifetime ** active_tmp
void _lsra_new_stack(lsradata *, stackelement_t *, int, int, int)
void lsra_join_lifetimes(jitdata *, int)
void lsra_scan_registers_canditates(jitdata *, int)
#define STAT_DECLARE_VAR(type, var, init)
Declare an external statistics variable.