void loopmark(Reg **rpo2r, int32_t head, Reg *r) { if(r->rpo < head || r->active == head) return; r->active = head; r->loop += LOOP; if(r->p1 != R) loopmark(rpo2r, head, r->p1); for(r = r->p2; r != R; r = r->p2link) loopmark(rpo2r, head, r); }
static void loopmark(Flow **rpo2r, int32 head, Flow *r) { if(r->rpo < head || r->active == head) return; r->active = head; r->loop += LOOP; if(r->p1 != nil) loopmark(rpo2r, head, r->p1); for(r = r->p2; r != nil; r = r->p2link) loopmark(rpo2r, head, r); }
void flowrpo(Graph *g) { Flow *r1; int32 i, d, me, nr, *idom; Flow **rpo2r; free(g->rpo); g->rpo = calloc(g->num*sizeof g->rpo[0], 1); idom = calloc(g->num*sizeof idom[0], 1); if(g->rpo == nil || idom == nil) fatal("out of memory"); for(r1 = g->start; r1 != nil; r1 = r1->link) r1->active = 0; rpo2r = g->rpo; d = postorder(g->start, rpo2r, 0); nr = g->num; if(d > nr) fatal("too many reg nodes %d %d", d, nr); nr = d; for(i = 0; i < nr / 2; i++) { r1 = rpo2r[i]; rpo2r[i] = rpo2r[nr - 1 - i]; rpo2r[nr - 1 - i] = r1; } for(i = 0; i < nr; i++) rpo2r[i]->rpo = i; idom[0] = 0; for(i = 0; i < nr; i++) { r1 = rpo2r[i]; me = r1->rpo; d = -1; // rpo2r[r->rpo] == r protects against considering dead code, // which has r->rpo == 0. if(r1->p1 != nil && rpo2r[r1->p1->rpo] == r1->p1 && r1->p1->rpo < me) d = r1->p1->rpo; for(r1 = r1->p2; r1 != nil; r1 = r1->p2link) if(rpo2r[r1->rpo] == r1 && r1->rpo < me) d = rpolca(idom, d, r1->rpo); idom[i] = d; } for(i = 0; i < nr; i++) { r1 = rpo2r[i]; r1->loop++; if(r1->p2 != nil && loophead(idom, r1)) loopmark(rpo2r, i, r1); } free(idom); for(r1 = g->start; r1 != nil; r1 = r1->link) r1->active = 0; }
void loopit(Reg *r, int32 nr) { Reg *r1; int32 i, d, me; if(nr > maxnr) { rpo2r = mal(nr * sizeof(Reg*)); idom = mal(nr * sizeof(int32)); maxnr = nr; } d = postorder(r, rpo2r, 0); if(d > nr) fatal("too many reg nodes %d %d", d, nr); nr = d; for(i = 0; i < nr / 2; i++) { r1 = rpo2r[i]; rpo2r[i] = rpo2r[nr - 1 - i]; rpo2r[nr - 1 - i] = r1; } for(i = 0; i < nr; i++) rpo2r[i]->rpo = i; idom[0] = 0; for(i = 0; i < nr; i++) { r1 = rpo2r[i]; me = r1->rpo; d = -1; // rpo2r[r->rpo] == r protects against considering dead code, // which has r->rpo == 0. if(r1->p1 != R && rpo2r[r1->p1->rpo] == r1->p1 && r1->p1->rpo < me) d = r1->p1->rpo; for(r1 = r1->p2; r1 != nil; r1 = r1->p2link) if(rpo2r[r1->rpo] == r1 && r1->rpo < me) d = rpolca(idom, d, r1->rpo); idom[i] = d; } for(i = 0; i < nr; i++) { r1 = rpo2r[i]; r1->loop++; if(r1->p2 != R && loophead(idom, r1)) loopmark(rpo2r, i, r1); } }
void loopit(Reg *r, int32_t nr) { Reg *r1; int32_t i, d, me; if(nr > maxnr) { rpo2r = alloc(nr * sizeof(Reg*)); idom = alloc(nr * sizeof(int32_t)); maxnr = nr; } d = postorder(r, rpo2r, 0); if(d > nr) fatal(Z, "too many reg nodes"); nr = d; for(i = 0; i < nr / 2; i++){ r1 = rpo2r[i]; rpo2r[i] = rpo2r[nr - 1 - i]; rpo2r[nr - 1 - i] = r1; } for(i = 0; i < nr; i++) rpo2r[i]->rpo = i; idom[0] = 0; for(i = 0; i < nr; i++){ r1 = rpo2r[i]; me = r1->rpo; d = -1; if(r1->p1 != R && r1->p1->rpo < me) d = r1->p1->rpo; for(r1 = r1->p2; r1 != nil; r1 = r1->p2link) if(r1->rpo < me) d = rpolca(idom, d, r1->rpo); idom[i] = d; } for(i = 0; i < nr; i++){ r1 = rpo2r[i]; r1->loop++; if(r1->p2 != R && loophead(idom, r1)) loopmark(rpo2r, i, r1); } }