BRIGGS_SET *briggsAlloct(int size) { BRIGGS_SET *p = tAlloc(sizeof(BRIGGS_SET)); p-> indexes = tAlloc(sizeof(*p->indexes) * size); p->data = tAlloc(sizeof(*p->data) * size); p->size = size ; return p; }
static void PostDominators(void) { int w, i; domCount = 0; WalkFlowgraph(blockArray[exitBlock], domNumber, FALSE); vectorData = tAlloc(sizeof(struct _tarjan *) * (domCount + 1)); for (i=0; i <= domCount; i++) { vectorData[i] = tAlloc(sizeof(struct _tarjan)); vectorData[i]->bucket = briggsAlloct(domCount+1); } WalkFlowgraph(blockArray[exitBlock], domInit, FALSE); for (w = domCount; w>=2; w--) { int p = vectorData[w]->parent; int j; struct _tarjan *v = vectorData[w]; BLOCKLIST *bl = v->preds; while (bl) { int u = domEval(bl->block->dfstOrder); if (vectorData[w]->semi > vectorData[u]->semi) vectorData[w]->semi = vectorData[u]->semi; bl = bl->next; } briggsSet(vectorData[vectorData[w]->semi]->bucket, w); domLink(p, w); for (j = vectorData[p]->bucket->top -1 ; j >= 0; j--) { int v = vectorData[p]->bucket->data[j]; int u = domEval(v); if (vectorData[u]->semi >= p) vectorData[v]->idom = p; else vectorData[v]->idom = u; } briggsClear(vectorData[p]->bucket); } for (w=2; w <=domCount; w++) { if (vectorData[w]->idom != vectorData[w]->semi) { vectorData[w]->idom = vectorData[vectorData[w]->idom]->idom; } /* transfer idom to our block struct */ blockArray[vectorData[w]->blocknum]->pdom = vectorData[vectorData[w]->idom]->blocknum; } tFree(); }
BITARRAY *tallocbit(int size) { BITARRAY *rv = tAlloc(sizeof(BITARRAY) - 1 + (size + (BITINTBITS-1))/BITINTBITS * sizeof(BITINT)); rv->count = size; return rv; }
static void Dominators(void) { int w, i; domCount = 0; WalkFlowgraph(blockArray[0], domNumber, TRUE); vectorData = tAlloc(sizeof(struct _tarjan *) * (domCount + 1)); for (i=0; i <= domCount; i++) { vectorData[i] = tAlloc(sizeof(struct _tarjan)); vectorData[i]->bucket = briggsAlloct(domCount+1); } WalkFlowgraph(blockArray[0], domInit, TRUE); for (w = domCount; w>=2; w--) { int p = vectorData[w]->parent; int j; struct _tarjan *v = vectorData[w]; BLOCKLIST *bl = v->preds; while (bl) { int u = domEval(bl->block->dfstOrder); if (vectorData[w]->semi > vectorData[u]->semi) vectorData[w]->semi = vectorData[u]->semi; bl = bl->next; } briggsSet(vectorData[vectorData[w]->semi]->bucket, w); domLink(p, w); for (j = vectorData[p]->bucket->top -1 ; j >= 0; j--) { int v = vectorData[p]->bucket->data[j]; int u = domEval(v); if (vectorData[u]->semi >= p) vectorData[v]->idom = p; else vectorData[v]->idom = u; } briggsClear(vectorData[p]->bucket); } for (w=2; w <=domCount; w++) { if (vectorData[w]->idom != vectorData[w]->semi) { vectorData[w]->idom = vectorData[vectorData[w]->idom]->idom; } /* transfer idom to our block struct */ blockArray[vectorData[w]->blocknum]->idom = vectorData[vectorData[w]->idom]->blocknum; } /* now make the forward tree */ for (i=blockCount-1; i >=1; i--) { /* make dominates lists by walking the idom tree backwards from each node*/ if (blockArray[i] && blockArray[i]->pred) { int w = blockArray[i]->idom; BLOCK *ub = blockArray[w]; BLOCKLIST *bl = oAlloc(sizeof(BLOCKLIST)); bl->block = blockArray[i]; bl->next = ub->dominates; ub->dominates = bl; } } tFree(); }