Ejemplo n.º 1
0
	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);
						}
					}
				}
			}
		}
	}
Ejemplo n.º 2
0
	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);
			}
		}
	}