[cfe-dev] Question about finding nested for-loops
Anja Gerbes
anja.gerbes at googlemail.com
Tue Jul 15 00:27:04 PDT 2014
Hi All,
This is my example function to explaining my problem:
void BM_MatrixMultiplication_var(int NVar)
{
for(int i=0; i < NConst1; i++) //MatrixARow
{
for(int j=0; j < NVar; j++) //MatrixBColumn
{
fResultMatrix[i][j] = 0.0;
for(int k = 0; k < NVar; k++) //MatrixAColumn
{
fResultMatrix[i][j] += fMatrixA[i][k] *
fMatrixB[k][j];
}
}
}
}
This is my function what i want to change with clang.
This is my goal:
void BM_MatrixMultiplication_var(int NVar)
{
LIKWID_MARKER_START(for-loop-1-BM_MatrixMultiplication_var);
for(int i=0; i < NConst1; i++) //MatrixARow
{
for(int j=0; j < NVar; j++) //MatrixBColumn
{
fResultMatrix[i][j] = 0.0;
for(int k = 0; k < NVar; k++) //MatrixAColumn
{
fResultMatrix[i][j] += fMatrixA[i][k] *
fMatrixB[k][j];
}
}
}
}
LIKWID_MARKER_STOP(for-loop-1-BM_MatrixMultiplication_var);
I tried to work with AST Matcher.
And I get already:
void BM_MatrixMultiplication_var(int NVar)
{
for(int i=0; i < NConst1; i++) //MatrixARow
{
LIKWID_MARKER_START();
for(int j=0; j < NVar; j++) //MatrixBColumn
{
fResultMatrix[i][j] = 0.0;
LIKWID_MARKER_START();
for(int k = 0; k < NVar; k++) //MatrixAColumn
{
fResultMatrix[i][j] += fMatrixA[i][k] *
fMatrixB[k][j];
}
LIKWID_MARKER_STOP();
}
LIKWID_MARKER_STOP();
}
}
With the following statement: StatementMatcher ForLoop =
forStmt(hasAncestor(forStmt())).bind( "forStmt" );
// Finding nested Loop
//for (int i= 0; i < expr(); ++i) hasAncestor(forStmt())
//{
// for (int i= 0; i < expr(); ++i) forStmt()
// {
// Berechnung
// }
//}
//
It is not perfect. What i have to do?
Can you tell me?
I tried different statements and got different errors. what i am doing
wrong?
//StatementMatcher ForLoop = compoundStmt( hasParent( forStmt( hasAncestor(
forStmt( ))))).bind( "forStmt" );
//
//for (int i= 0; i < expr(); ++i) hasAncestor(forStmt())
//{
// for (int i= 0; i < expr(); ++i) hasParent(forStmt())
// { compoundStmt()
// Berechnung
// } compoundStmt()
//}
//
//{ hasParent(compoundStmt())
// for (int i= 0; i < expr(); ++i) hasAncestor(forStmt())
// {
// for (int i= 0; i < expr(); ++i) forStmt()
// {
// Berechnung
// }
// }
//} compoundStmt()
//
//StatementMatcher ForLoop =
forStmt(hasAncestor(forStmt(hasParent(compoundStmt()).bind("outerForStmt"));
//StatementMatcher ForLoop = forStmt().bind("forStmt");
//
// for (int i= 0; i < expr(); ++i) forStmt()
// {
// Berechnung
// }
//
//for (int i= 0; i < expr(); ++i) { ... }
StatementMatcher LoopMatcher =
forStmt( // for ([init]; [condition]; [increment])
hasLoopInit(
declStmt(
hasSingleDecl(varDecl(hasInitializer(integerLiteral(equals(0)))) // Die
Initialisierung hat eine einzige Variable und ist mit dem Ganzzahlliteral 0
initialisiert
.bind("initVarName")))),
hasIncrement( // "increment" part of for-loop
unaryOperator( // any unary op, e.g. *, &, --
hasOperatorName("++"), // exact
unary op: ++
hasUnaryOperand(declRefExpr(to(varDecl(hasType(isInteger())).bind("incVarName"))))
)
),
hasCondition(binaryOperator(
hasOperatorName("<"),
hasLHS(ignoringParenImpCasts(declRefExpr(to(varDecl(hasType(isInteger())).bind("condVarName"))))),
hasRHS(expr(hasType(isInteger()))))
)
).bind("forLoop");
Thank Your for Your reply
Anja
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140715/37856866/attachment.html>
More information about the cfe-dev
mailing list