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 << "`"; }