Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.62 KB | None | 0 0
  1. #define export exports
  2. extern "C" {
  3.     #include "qbe/all.h"
  4. }
  5. #undef export
  6.  
  7. #include <iostream>
  8. #include <vector>
  9. #include <algorithm>
  10. #include <cstring>
  11.  
  12. using namespace std;
  13.  
  14. static void phiinsert(Fn *fn) {
  15.     Blk *b;
  16.     uint i = 0;
  17.     while (i < fn->ntmp) {
  18.         vector<Blk*> WorkList;
  19.         auto &x = fn->tmp[i].name;
  20.         if (strcmp(reinterpret_cast<const char *>(x), "\0") == 0) {
  21.             i++;
  22.             continue;
  23.         }
  24.         bool flag = false;
  25.         uint tmp_idx = 0;
  26.         for (b = fn->start; b; b = b->link) {
  27.             for (uint j = 0; j < b->nins; j++) {
  28.                 if (strcmp(fn->tmp[b->ins[j].to.val].name, x) == 0) {
  29.                     tmp_idx = b->ins[j].to.val;
  30.                     flag = true;
  31.                     WorkList.push_back(b);
  32.                     break;
  33.                 }
  34.             }
  35.         }
  36.         if (flag) {
  37.             int k = 0;
  38.             while (k < WorkList.size()) {
  39.                 auto it = WorkList[k];
  40.                 for (uint j = 0 ; j < it->nfron; j++) {
  41.                     Blk *d = it->fron[j];
  42.                     bool flagPhi = false;
  43.                     for (Phi *ph = d->phi; ph; ph = ph->link) {
  44.                         if (ph->to.val == tmp_idx) {
  45.                             flagPhi = true;
  46.                         }
  47.                     }
  48.                     if (!flagPhi) {
  49.                         //insert phi
  50.                         Phi *p = new Phi;
  51.                         p->cls = -1;
  52.                         p->to = TMP(tmp_idx);
  53.                         p->link = d->phi;
  54.                         fn->tmp[p->to.val].visit = p->to.val;
  55.                         d->phi = p;
  56.                     }
  57.                     bool flagD = false;
  58.                     for (auto & t : WorkList)
  59.                         if (t->name == d->name) {
  60.                             flagD = true;
  61.                             break;
  62.                         }
  63.                     if (!flagD)
  64.                         WorkList.push_back(d);
  65.                 }
  66.                 k++;
  67.             }
  68.         }
  69.         i++;
  70.     }
  71.  
  72. }
  73.  
  74.  
  75. static void newname(Ref *r, Blk *b, vector<Ref> *stk, Fn * fn, int *counter) {
  76.     int tmp_idx = r->val;
  77.     int i = counter[tmp_idx];
  78.     counter[tmp_idx]++;
  79.     Ref r1 = newtmp(nullptr, fn->tmp[tmp_idx].cls, fn);
  80.     snprintf(fn->tmp[fn->ntmp-1].name, NString, "%s", fn->tmp[tmp_idx].name);
  81.     fn->tmp[fn->ntmp-1].phi = i;
  82.     fn->tmp[fn->ntmp-1].visit = tmp_idx;
  83.     stk[tmp_idx].push_back(r1);
  84.     *r = r1;
  85. }
  86.  
  87. static void rename(Fn *fn, Blk *b, vector<Ref> *stk, int *counter) {
  88.     for (Phi *p = b->phi; p; p = p->link) {
  89.         newname(&p->to, b, stk, fn, counter);
  90.     }
  91.     for (Ins *i = b->ins; i - b->ins < b->nins; i++) {
  92.         newname(&i->to, b, stk, fn, counter);
  93.     }
  94.     Blk *succ[3], **ps, *s;
  95.     int t, m;
  96.     succ[0] = b->s1;
  97.     succ[1] = b->s2 == b->s1 ? nullptr : b->s2;
  98.     succ[2] = nullptr;
  99.     for (ps = succ; (s = *ps); ps++)
  100.         for (Phi *p = s->phi; p; p = p->link) {
  101.             t = fn->tmp[p->to.val].visit;
  102.             m = p->narg++;
  103.             if (!stk[t].empty())
  104.                 p->arg[m] = stk[t].back();
  105.             else {
  106.                 fn->tmp[t].phi = -1;
  107.                 p->arg[m] = p->to;
  108.             }
  109.             p->blk[m] = b;
  110.         }
  111.     for (s = b->dom; s; s = s->dlink)
  112.         rename(fn, s, stk, counter);
  113.     for (Phi *p = b->phi; p && !stk[fn->tmp[p->to.val].visit].empty(); p = p->link) {
  114.         stk[fn->tmp[p->to.val].visit].pop_back();
  115.     }
  116.     for (Ins *i = b->ins; i - b->ins < b->nins && !stk[fn->tmp[i->to.val].visit].empty(); i++)
  117.         stk[fn->tmp[i->to.val].visit].pop_back();
  118. }
  119.  
  120. static void readfn (Fn *fn) {
  121.     fillrpo(fn);
  122.     filldom(fn);
  123.     fillfron(fn);
  124.     filllive(fn);
  125.     phiinsert(fn);
  126.     auto *stk = new vector<Ref>[fn->ntmp];
  127.     int *counter;
  128.     counter = (int *)emalloc(sizeof(int) * fn->ntmp);
  129.     memset(counter, 0, sizeof(int)*fn->ntmp);
  130.     rename(fn, fn->start, stk, counter);
  131.     for (Blk *blk = fn->start; blk; blk = blk->link) {
  132.         cout << '@' << blk->name << ":" << endl;
  133.         for (Phi *p = blk->phi; p; p = p->link) {
  134.             cout << '%' << fn->tmp[p->to.val].name << " " << fn->tmp[p->to.val].phi << " ";
  135.             for (int i = 0; p->blk[i]; i++)
  136.                 cout << '@' << p->blk[i]->name << " " << fn->tmp[p->arg[i].val].phi << " ";
  137.             cout << endl;
  138.         }
  139.     }
  140. //    delete[] counter;
  141. //    delete[] stk;
  142. }
  143.  
  144. static void readdat (Dat *dat) {
  145.     (void) dat;
  146. }
  147.  
  148. int main (void) {
  149.     parse(stdin, "<stdin>", readdat, readfn);
  150.     freeall();
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement