Example #1
0
int main()
{
  char c;
  c = 'z';
  c = returnA(&c);
  if (c != 'A') abort();
  c = returnB();
  if (c != 'B') abort();
  test();
  return 0;
}
TEST_F(AuxiliaryVariablesOptimizerTests,
DoNotOptimizeWhenOriginalValueIsUsedAfter) {
	// Add a body to the testing function:
	//
	//   a = 1  (VarDefStmt)
	//   b = a  (VarDefStmt)
	//   return a
	//
	ShPtr<Variable> varA(Variable::create("a", IntType::create(16)));
	ShPtr<Variable> varB(Variable::create("b", IntType::create(16)));
	ShPtr<ConstInt> constInt1(ConstInt::create(llvm::APInt(16, 1)));
	ShPtr<ReturnStmt> returnA(ReturnStmt::create(varA));
	ShPtr<VarDefStmt> varDefB(
		VarDefStmt::create(varB, varA, returnA));
	ShPtr<VarDefStmt> varDefA(
		VarDefStmt::create(varA, constInt1, varDefB));
	testFunc->setBody(varDefA);

	INSTANTIATE_ALIAS_ANALYSIS_AND_VALUE_ANALYSIS(module);

	// Optimize the module.
	Optimizer::optimize<AuxiliaryVariablesOptimizer>(module, va,
		OptimCallInfoObtainer::create());

	// Check that the output is correct.
	// a = 1
	ShPtr<Statement> stmt1(testFunc->getBody());
	ASSERT_EQ(varDefA, stmt1) <<
		"expected `" << varDefA << "`, got `" << stmt1 << "`";
	// b = a
	ShPtr<Statement> stmt2(stmt1->getSuccessor());
	ASSERT_EQ(varDefB, stmt2) <<
		"expected `" << varDefB << "`, got `" << stmt2 << "`";
	// return a
	ShPtr<Statement> stmt3(stmt2->getSuccessor());
	ASSERT_EQ(returnA, stmt3) <<
		"expected `" << returnA << "`, got `" << stmt3 << "`";
}