void ConsistencyChecker::checkAllBlocksWithMultiplePredecessorsHavePhi() { List<BasicBlock*, LIST_GCObjects>* basicBlocks = _functionToCheck->getBasicBlocksInReversePostOrder(); TessaAssert(basicBlocks != NULL); char messageBuffer[64]; for (uint32_t i = 0; i < basicBlocks->size(); i++) { BasicBlock* currentBasicBlock = basicBlocks->get(i); if (currentBasicBlock->getPredecessors()->size() > 1) { List<TessaInstruction*, LIST_GCObjects>* instructions = currentBasicBlock->getInstructions(); for (uint32_t j = 0; j < instructions->size(); j++) { TessaInstruction* instruction = instructions->get(j); if (instruction->isParameter()) { ParameterInstruction* paramInstruction = (ParameterInstruction*) instruction; TessaInstruction* forwardInstruction = paramInstruction->resolve(); VMPI_snprintf(messageBuffer, sizeof(messageBuffer), "BB %d Param %d does not map to Phi \n", currentBasicBlock->getBasicBlockId(), paramInstruction->getValueId()); TessaAssertMessage(forwardInstruction->isPhi(), messageBuffer); if (!forwardInstruction->isPhi()) { printf("%s\n", messageBuffer); } } } } } }
void ConsistencyChecker::checkAllBlocksHaveOneTerminator() { List<BasicBlock*, LIST_GCObjects>* basicBlocks = _functionToCheck->getBasicBlocksInReversePostOrder(); TessaAssert(basicBlocks != NULL); char messageBuffer[64]; for (uint32_t i = 0; i < basicBlocks->size(); i++) { BasicBlock* currentBasicBlock = basicBlocks->get(i); List<TessaInstruction*, LIST_GCObjects>* instructions = currentBasicBlock->getInstructions(); int numberOfTerminators = 0; for (uint32_t j = 0; j < instructions->size(); j++) { if (instructions->get(j)->isBlockTerminator()) { numberOfTerminators++; } } VMPI_snprintf(messageBuffer, sizeof(messageBuffer), "BB %d has %d terminators instruction\n", currentBasicBlock->getBasicBlockId(), numberOfTerminators); TessaAssertMessage(numberOfTerminators == 1, messageBuffer); if (numberOfTerminators != 1) { printf("%s\n", messageBuffer); } } }