Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. typedef struct Name Name;
  2. struct Name {
  3.     Ref r;
  4.     Blk *b;
  5. };
  6.  
  7. static void newname(Ref *r, Blk *b, vector<Name> *stk, Fn * fn, int *counter) {
  8.     int tmp_idx = r->val;
  9.     int i = counter[tmp_idx];
  10.     counter[tmp_idx]++;
  11.     Name x1;
  12.     Ref r1 = newtmp(fn->tmp[tmp_idx].name, i, fn);
  13.     x1.r = r1;
  14.     x1.b = b;
  15.     stk[tmp_idx].push_back(x1);
  16.     *r = r1;
  17. }
  18.  
  19. static Ref
  20. getstk(int t, Blk *b, vector<Name> *stk)
  21. {
  22.     auto &n = stk[t].back();
  23.     while (!stk[t].empty() && !dom(n.b, b)) {
  24.         stk[t].pop_back();
  25.     }
  26.     n = stk[t].back();
  27.     return n.r;
  28. }
  29.  
  30. static void rename(Fn *fn, Blk *b, vector<Name> *stk, int *counter) {
  31.     for (Phi *p = b->phi; p; p = p->link) {
  32.         newname(&p->to, b, stk, fn, counter);
  33.     }
  34.     for (Ins *i = b->ins; i - b->ins < b->nins; i++) {
  35.         for (auto & k : i->arg) {
  36.             int t = k.val;
  37.             if (fn->tmp[t].visit)
  38.                 k = getstk(t, b, stk);
  39.         }
  40.         newname(&i->to, b, stk, fn, counter);
  41.     }
  42.     Blk *succ[3], **ps, *s;
  43.     int t, m;
  44.     succ[0] = b->s1;
  45.     succ[1] = b->s2 == b->s1 ? nullptr : b->s2;
  46.     succ[2] = nullptr;
  47.     for (ps = succ; (s = *ps); ps++)
  48.         for (Phi *p = s->phi; p; p = p->link) {
  49.             t = p->to.val;
  50.             if ((t = fn->tmp[t].visit)) {
  51.                 m = p->narg++;
  52.                 p->arg[m] = getstk(t, b, stk);
  53.                 p->blk[m] = b;
  54.             }
  55.         }
  56.     for (s = b->dom; s; s = s->dlink)
  57.         rename(fn, s, stk, counter);
  58.     for (Phi *p = b->phi; p; p = p->link) {
  59.         stk[p->to.val].pop_back();
  60.     }
  61.     for (Ins *i = b->ins; i - b->ins < b->nins; i++)
  62.         stk[i->to.val].pop_back();
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement