本文整理汇总了C++中StatementList::remove_statement方法的典型用法代码示例。如果您正苦于以下问题:C++ StatementList::remove_statement方法的具体用法?C++ StatementList::remove_statement怎么用?C++ StatementList::remove_statement使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类StatementList
的用法示例。
在下文中一共展示了StatementList::remove_statement方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: do_procedure_definition
//.........这里部分代码省略.........
int firstStatementPosition = -1 ;
i = 0 ;
while (i < innermost->get_statement_count())
{
StoreVariableStatement* currentStoreVariable =
dynamic_cast<StoreVariableStatement*>(innermost->get_statement(i)) ;
if (currentStoreVariable != NULL && IsSummation(currentStoreVariable))
{
firstStatement = currentStoreVariable ;
firstStatementPosition = i ;
break ;
}
++i ;
}
if (firstStatement != NULL)
{
VariableSymbol* firstDest = firstStatement->get_destination() ;
for (int j = i+1 ; j < innermost->get_statement_count() ; ++j)
{
StoreVariableStatement* nextStoreVar =
dynamic_cast<StoreVariableStatement*>(innermost->get_statement(j));
if (nextStoreVar != NULL && IsSummation(nextStoreVar, firstDest))
{
secondStatement = nextStoreVar ;
break ;
}
if (IsDefinition(innermost->get_statement(j), firstDest) ||
HasUses(innermost->get_statement(j), firstDest))
{
break ;
}
}
}
if (secondStatement != NULL)
{
// Go through each of the variables used in the first statement and
// make sure there are no definitions to any of them.
// I only have to worry about variables and not array accesses because
// we don't allow them to read and write to array values.
int originalPosition = DeterminePosition(innermost, firstStatement) ;
assert(originalPosition >= 0) ;
list<VariableSymbol*> usedVars =
AllUsedVariablesBut(firstStatement, firstStatement->get_destination());
bool goodPath = true ;
for (int j = originalPosition ;
j < innermost->get_statement_count() &&
innermost->get_statement(j) != secondStatement ;
++j)
{
list<VariableSymbol*>::iterator usedIter = usedVars.begin() ;
while (usedIter != usedVars.end())
{
if (IsOutputVariable((*usedIter), innermost->get_statement(j)))
{
goodPath = false ;
break ;
}
++usedIter ;
}
if (!goodPath)
{
break ;
}
}
if (!goodPath)
{
continue ;
}
// Actually do the combining here
change = true ;
Expression* remains = RemoveValue(firstStatement) ;
Expression* secondRemains = RemoveValue(secondStatement) ;
// Create two binary expressions
BinaryExpression* remainsSum =
create_binary_expression(theEnv,
remains->get_result_type(),
LString("add"),
remains,
secondRemains) ;
LoadVariableExpression* loadDest =
create_load_variable_expression(theEnv,
secondStatement->get_destination()->get_type()->get_base_type(),
secondStatement->get_destination()) ;
BinaryExpression* finalSum =
create_binary_expression(theEnv,
remainsSum->get_result_type(),
LString("add"),
remainsSum,
loadDest) ;
secondStatement->set_value(finalSum) ;
// Delete?
innermost->remove_statement(firstStatementPosition) ;
}
} while (change == true) ;
OutputInformation("Combine summation pass ends") ;
}
示例2: assert
void CopyPropagationPass2::ProcessSpecialIfs()
{
list<IfStatement*>* allIfs =
collect_objects<IfStatement>(procDef->get_body()) ;
assert(allIfs != NULL) ;
list<IfStatement*>::iterator ifIter = allIfs->begin() ;
while (ifIter != allIfs->end())
{
Statement* elsePart = (*ifIter)->get_else_part() ;
assert(elsePart != NULL) ;
StatementList* elseList = dynamic_cast<StatementList*>(elsePart) ;
if (elseList == NULL)
{
++ifIter ;
continue ;
}
assert(elseList != NULL) ;
if (elseList->get_statement_count() == 2)
{
// Process this if statement
Statement* thenPart = (*ifIter)->get_then_part() ;
assert(thenPart != NULL) ;
/*
StatementList* thenList = dynamic_cast<StatementList*>(thenPart) ;
assert(thenList != NULL) ;
assert(thenList->get_statement_count() == 1) ;
Statement* thenStatement = thenList->get_statement(0) ;
assert(thenStatement != NULL) ;
*/
StoreVariableStatement* thenStoreVar =
dynamic_cast<StoreVariableStatement*>(thenPart) ;
assert(thenStoreVar != NULL) ;
Statement* firstElseStatement = elseList->get_statement(0) ;
Statement* secondElseStatement = elseList->get_statement(1) ;
assert(firstElseStatement != NULL && secondElseStatement != NULL) ;
// We are definitely going to break the rules here
// We know that the destination has to be replaced with
// the source
StoreVariableStatement* secondElseStore =
dynamic_cast<StoreVariableStatement*>(secondElseStatement) ;
assert(secondElseStore != NULL) ;
Expression* source = secondElseStore->get_value() ;
assert(source != NULL) ;
LoadVariableExpression* sourceLoadExp =
dynamic_cast<LoadVariableExpression*>(source) ;
assert(sourceLoadExp != NULL) ;
VariableSymbol* sourceVariable = sourceLoadExp->get_source() ;
assert(sourceVariable != NULL) ;
// First, find the use of the then portion and replace that use
// with the source variable
BrickAnnote* ba =
to<BrickAnnote>(thenStoreVar->lookup_annote_by_name("reached_uses")) ;
assert(ba != NULL) ;
assert(ba->get_brick_count() == 1) ;
Iter<SuifBrick*> tmpIter = ba->get_brick_iterator() ;
SuifObjectBrick* sob =
to<SuifObjectBrick>(tmpIter.current()) ;
assert(sob != NULL) ;
SuifObject* finalDest = sob->get_object() ;
LoadVariableExpression* finalLoad =
dynamic_cast<LoadVariableExpression*>(finalDest) ;
assert(finalLoad != NULL) ;
// Before we make the change, mark the variable we are replacing as
// removed.
finalLoad->get_source()->append_annote(create_brick_annote(theEnv, "RemovedVariable")) ;
finalLoad->set_source(sourceVariable) ;
// Now, change the then portion
thenStoreVar->set_destination(sourceVariable) ;
// Now, remove the second else statement
elseList->remove_statement(1) ;
// We should be done.
}
++ifIter ;
//.........这里部分代码省略.........