Example #1
0
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;
}
Example #2
0
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();
}
Example #3
0
BITARRAY *tallocbit(int size)
{
    BITARRAY *rv = tAlloc(sizeof(BITARRAY) - 1 + (size + (BITINTBITS-1))/BITINTBITS * sizeof(BITINT));
    rv->count = size;
    return rv;
}
Example #4
0
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();
}