Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define export exports
- extern "C" {
- #include "qbe/all.h"
- }
- #undef export
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- static void phiinsert(Fn *fn) {
- Blk *b;
- uint i = 0;
- while (i < fn->ntmp) {
- vector<Blk*> WorkList;
- auto &x = fn->tmp[i].name;
- if (strcmp(reinterpret_cast<const char *>(x), "\0") == 0) {
- i++;
- continue;
- }
- bool flag = false;
- uint tmp_idx = 0;
- for (b = fn->start; b; b = b->link) {
- for (uint j = 0; j < b->nins; j++) {
- if (strcmp(fn->tmp[b->ins[j].to.val].name, x) == 0) {
- tmp_idx = b->ins[j].to.val;
- flag = true;
- WorkList.push_back(b);
- break;
- }
- }
- }
- if (flag) {
- int k = 0;
- while (k < WorkList.size()) {
- auto it = WorkList[k];
- for (uint j = 0 ; j < it->nfron; j++) {
- Blk *d = it->fron[j];
- bool flagPhi = false;
- for (Phi *ph = d->phi; ph; ph = ph->link) {
- if (ph->to.val == tmp_idx) {
- flagPhi = true;
- }
- }
- if (!flagPhi) {
- //insert phi
- Phi *p = new Phi;
- p->cls = -1;
- p->to = TMP(tmp_idx);
- p->link = d->phi;
- fn->tmp[p->to.val].visit = p->to.val;
- d->phi = p;
- }
- bool flagD = false;
- for (auto & t : WorkList)
- if (t->name == d->name) {
- flagD = true;
- break;
- }
- if (!flagD)
- WorkList.push_back(d);
- }
- k++;
- }
- }
- i++;
- }
- }
- static void newname(Ref *r, Blk *b, vector<Ref> *stk, Fn * fn, int *counter) {
- int tmp_idx = r->val;
- int i = counter[tmp_idx];
- counter[tmp_idx]++;
- Ref r1 = newtmp(nullptr, fn->tmp[tmp_idx].cls, fn);
- snprintf(fn->tmp[fn->ntmp-1].name, NString, "%s", fn->tmp[tmp_idx].name);
- fn->tmp[fn->ntmp-1].phi = i;
- fn->tmp[fn->ntmp-1].visit = tmp_idx;
- stk[tmp_idx].push_back(r1);
- *r = r1;
- }
- static void rename(Fn *fn, Blk *b, vector<Ref> *stk, int *counter) {
- for (Phi *p = b->phi; p; p = p->link) {
- newname(&p->to, b, stk, fn, counter);
- }
- for (Ins *i = b->ins; i - b->ins < b->nins; i++) {
- newname(&i->to, b, stk, fn, counter);
- }
- Blk *succ[3], **ps, *s;
- int t, m;
- succ[0] = b->s1;
- succ[1] = b->s2 == b->s1 ? nullptr : b->s2;
- succ[2] = nullptr;
- for (ps = succ; (s = *ps); ps++)
- for (Phi *p = s->phi; p; p = p->link) {
- t = fn->tmp[p->to.val].visit;
- m = p->narg++;
- if (!stk[t].empty())
- p->arg[m] = stk[t].back();
- else {
- fn->tmp[t].phi = -1;
- p->arg[m] = p->to;
- }
- p->blk[m] = b;
- }
- for (s = b->dom; s; s = s->dlink)
- rename(fn, s, stk, counter);
- for (Phi *p = b->phi; p && !stk[fn->tmp[p->to.val].visit].empty(); p = p->link) {
- stk[fn->tmp[p->to.val].visit].pop_back();
- }
- for (Ins *i = b->ins; i - b->ins < b->nins && !stk[fn->tmp[i->to.val].visit].empty(); i++)
- stk[fn->tmp[i->to.val].visit].pop_back();
- }
- static void readfn (Fn *fn) {
- fillrpo(fn);
- filldom(fn);
- fillfron(fn);
- filllive(fn);
- phiinsert(fn);
- auto *stk = new vector<Ref>[fn->ntmp];
- int *counter;
- counter = (int *)emalloc(sizeof(int) * fn->ntmp);
- memset(counter, 0, sizeof(int)*fn->ntmp);
- rename(fn, fn->start, stk, counter);
- for (Blk *blk = fn->start; blk; blk = blk->link) {
- cout << '@' << blk->name << ":" << endl;
- for (Phi *p = blk->phi; p; p = p->link) {
- cout << '%' << fn->tmp[p->to.val].name << " " << fn->tmp[p->to.val].phi << " ";
- for (int i = 0; p->blk[i]; i++)
- cout << '@' << p->blk[i]->name << " " << fn->tmp[p->arg[i].val].phi << " ";
- cout << endl;
- }
- }
- // delete[] counter;
- // delete[] stk;
- }
- static void readdat (Dat *dat) {
- (void) dat;
- }
- int main (void) {
- parse(stdin, "<stdin>", readdat, readfn);
- freeall();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement