live.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "all.h"
  2. void
  3. liveon(BSet *v, Blk *b, Blk *s)
  4. {
  5. Phi *p;
  6. uint a;
  7. bscopy(v, s->in);
  8. for (p=s->phi; p; p=p->link)
  9. if (rtype(p->to) == RTmp)
  10. bsclr(v, p->to.val);
  11. for (p=s->phi; p; p=p->link)
  12. for (a=0; a<p->narg; a++)
  13. if (p->blk[a] == b)
  14. if (rtype(p->arg[a]) == RTmp) {
  15. bsset(v, p->arg[a].val);
  16. bsset(b->gen, p->arg[a].val);
  17. }
  18. }
  19. static void
  20. bset(Ref r, Blk *b, int *nlv, Tmp *tmp)
  21. {
  22. if (rtype(r) != RTmp)
  23. return;
  24. bsset(b->gen, r.val);
  25. if (!bshas(b->in, r.val)) {
  26. nlv[KBASE(tmp[r.val].cls)]++;
  27. bsset(b->in, r.val);
  28. }
  29. }
  30. /* liveness analysis
  31. * requires rpo computation
  32. */
  33. void
  34. filllive(Fn *f)
  35. {
  36. Blk *b;
  37. Ins *i;
  38. int k, t, m[2], n, chg, nlv[2];
  39. BSet u[1], v[1];
  40. Mem *ma;
  41. bsinit(u, f->ntmp);
  42. bsinit(v, f->ntmp);
  43. for (b=f->start; b; b=b->link) {
  44. bsinit(b->in, f->ntmp);
  45. bsinit(b->out, f->ntmp);
  46. bsinit(b->gen, f->ntmp);
  47. }
  48. chg = 1;
  49. Again:
  50. for (n=f->nblk-1; n>=0; n--) {
  51. b = f->rpo[n];
  52. bscopy(u, b->out);
  53. if (b->s1) {
  54. liveon(v, b, b->s1);
  55. bsunion(b->out, v);
  56. }
  57. if (b->s2) {
  58. liveon(v, b, b->s2);
  59. bsunion(b->out, v);
  60. }
  61. chg |= !bsequal(b->out, u);
  62. memset(nlv, 0, sizeof nlv);
  63. b->out->t[0] |= T.rglob;
  64. bscopy(b->in, b->out);
  65. for (t=0; bsiter(b->in, &t); t++)
  66. nlv[KBASE(f->tmp[t].cls)]++;
  67. if (rtype(b->jmp.arg) == RCall) {
  68. assert((int)bscount(b->in) == T.nrglob &&
  69. b->in->t[0] == T.rglob);
  70. b->in->t[0] |= T.retregs(b->jmp.arg, nlv);
  71. } else
  72. bset(b->jmp.arg, b, nlv, f->tmp);
  73. for (k=0; k<2; k++)
  74. b->nlive[k] = nlv[k];
  75. for (i=&b->ins[b->nins]; i!=b->ins;) {
  76. if ((--i)->op == Ocall && rtype(i->arg[1]) == RCall) {
  77. b->in->t[0] &= ~T.retregs(i->arg[1], m);
  78. for (k=0; k<2; k++) {
  79. nlv[k] -= m[k];
  80. /* caller-save registers are used
  81. * by the callee, in that sense,
  82. * right in the middle of the call,
  83. * they are live: */
  84. nlv[k] += T.nrsave[k];
  85. if (nlv[k] > b->nlive[k])
  86. b->nlive[k] = nlv[k];
  87. }
  88. b->in->t[0] |= T.argregs(i->arg[1], m);
  89. for (k=0; k<2; k++) {
  90. nlv[k] -= T.nrsave[k];
  91. nlv[k] += m[k];
  92. }
  93. }
  94. if (!req(i->to, R)) {
  95. assert(rtype(i->to) == RTmp);
  96. t = i->to.val;
  97. if (bshas(b->in, t))
  98. nlv[KBASE(f->tmp[t].cls)]--;
  99. bsset(b->gen, t);
  100. bsclr(b->in, t);
  101. }
  102. for (k=0; k<2; k++)
  103. switch (rtype(i->arg[k])) {
  104. case RMem:
  105. ma = &f->mem[i->arg[k].val];
  106. bset(ma->base, b, nlv, f->tmp);
  107. bset(ma->index, b, nlv, f->tmp);
  108. break;
  109. default:
  110. bset(i->arg[k], b, nlv, f->tmp);
  111. break;
  112. }
  113. for (k=0; k<2; k++)
  114. if (nlv[k] > b->nlive[k])
  115. b->nlive[k] = nlv[k];
  116. }
  117. }
  118. if (chg) {
  119. chg = 0;
  120. goto Again;
  121. }
  122. if (debug['L']) {
  123. fprintf(stderr, "\n> Liveness analysis:\n");
  124. for (b=f->start; b; b=b->link) {
  125. fprintf(stderr, "\t%-10sin: ", b->name);
  126. dumpts(b->in, f->tmp, stderr);
  127. fprintf(stderr, "\t out: ");
  128. dumpts(b->out, f->tmp, stderr);
  129. fprintf(stderr, "\t gen: ");
  130. dumpts(b->gen, f->tmp, stderr);
  131. fprintf(stderr, "\t live: ");
  132. fprintf(stderr, "%d %d\n", b->nlive[0], b->nlive[1]);
  133. }
  134. }
  135. }