/* Worker function to compute the idom */ static bool computeImmediateDominator(CompilationUnit *cUnit, BasicBlock *bb) { GrowableList *blockList = &cUnit->blockList; BitVector *tempBlockV = cUnit->tempBlockV; BitVectorIterator bvIterator; BasicBlock *iDom; if (bb == cUnit->entryBlock) return false; dvmCopyBitVector(tempBlockV, bb->dominators); dvmClearBit(tempBlockV, bb->id); dvmBitVectorIteratorInit(tempBlockV, &bvIterator); /* Should not see any dead block */ assert(dvmCountSetBits(tempBlockV) != 0); if (dvmCountSetBits(tempBlockV) == 1) { iDom = (BasicBlock *) dvmGrowableListGetElement( blockList, dvmBitVectorIteratorNext(&bvIterator)); bb->iDom = iDom; } else { int iDomIdx = dvmBitVectorIteratorNext(&bvIterator); assert(iDomIdx != -1); while (true) { int nextDom = dvmBitVectorIteratorNext(&bvIterator); if (nextDom == -1) break; BasicBlock *nextDomBB = (BasicBlock *) dvmGrowableListGetElement(blockList, nextDom); /* iDom dominates nextDom - set new iDom */ if (dvmIsBitSet(nextDomBB->dominators, iDomIdx)) { iDomIdx = nextDom; } } iDom = (BasicBlock *) dvmGrowableListGetElement(blockList, iDomIdx); /* Set the immediate dominator block for bb */ bb->iDom = iDom; } /* Add bb to the iDominated set of the immediate dominator block */ dvmCompilerSetBit(iDom->iDominated, bb->id); return true; }
/* * Remove a register pair from the LIVE set. */ static inline void KILLW(BitVector* workBits, u4 regIndex) { dvmClearBit(workBits, regIndex); dvmClearBit(workBits, regIndex+1); }