diff --git a/0001-matrix_mult_ident-tool-commit.patch b/0001-matrix_mult_ident-tool-commit.patch new file mode 100644 index 0000000000000000000000000000000000000000..9876a619187b3f0d392028dd9756ce3f2485c0ea --- /dev/null +++ b/0001-matrix_mult_ident-tool-commit.patch @@ -0,0 +1,309 @@ +From 274eedfdc835def2f2aa8d6fe873e11374ea68ab Mon Sep 17 00:00:00 2001 +From: yuanshaobai <2659799534@qq.com> +Date: Wed, 14 Sep 2022 22:07:20 +0800 +Subject: [PATCH] matrix_mult_ident tool commit + +--- + clang/tools/clang-matrix-ident/CMakeLists.txt | 19 ++ + .../clang-matrix-ident/ClangMatrixIdent.cpp | 263 ++++++++++++++++++ + 2 files changed, 282 insertions(+) + create mode 100644 clang/tools/clang-matrix-ident/CMakeLists.txt + create mode 100644 clang/tools/clang-matrix-ident/ClangMatrixIdent.cpp + +diff --git a/clang/tools/clang-matrix-ident/CMakeLists.txt b/clang/tools/clang-matrix-ident/CMakeLists.txt +new file mode 100644 +index 000000000000..da808ac9fe23 +--- /dev/null ++++ b/clang/tools/clang-matrix-ident/CMakeLists.txt +@@ -0,0 +1,19 @@ ++set(LLVM_LINK_COMPONENTS ++ support ++) ++ ++add_clang_executable(clang-matrix-ident ++ ClangMatrixIdent.cpp ++ ) ++ ++clang_target_link_libraries(clang-matrix-ident ++ PRIVATE ++ clangAST ++ clangASTMatchers ++ clangTooling ++ clangBasic ++ clangDriver ++ clangFrontend ++ clangSerialization ++ clangToolingCore ++ ) +diff --git a/clang/tools/clang-matrix-ident/ClangMatrixIdent.cpp b/clang/tools/clang-matrix-ident/ClangMatrixIdent.cpp +new file mode 100644 +index 000000000000..963730cd05d8 +--- /dev/null ++++ b/clang/tools/clang-matrix-ident/ClangMatrixIdent.cpp +@@ -0,0 +1,263 @@ ++ ++#include ++#include "clang/Frontend/FrontendActions.h" ++#include "clang/Tooling/CommonOptionsParser.h" ++#include "clang/Tooling/Tooling.h" ++#include "llvm/Support/CommandLine.h" ++#include ++//#include ++//#include ++//#include ++ ++using namespace std; ++using namespace clang::tooling; ++using namespace llvm; ++static llvm::cl::OptionCategory MyToolCategory("matrix_ident options"); ++ ++#include "clang/ASTMatchers/ASTMatchers.h" ++#include "clang/ASTMatchers/ASTMatchFinder.h" ++ ++using namespace clang; ++using namespace clang::ast_matchers; ++ ++ ++StatementMatcher MatrixMatcher = ++forStmt(hasIncrement(unaryOperator().bind("firstop")), ++ hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral().bind("firstvar1"))).bind("firstvar")))), ++ hasCondition(binaryOperator(hasLHS(implicitCastExpr(hasSourceExpression(declRefExpr()))),hasRHS(integerLiteral().bind("firstvar2"))).bind("firstcondop")), ++ hasBody(compoundStmt(hasAnySubstatement( ++ forStmt(hasIncrement(unaryOperator().bind("secondop")), ++ hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral().bind("secondvar1"))).bind("secondvar")))), ++ hasCondition(binaryOperator(hasLHS(implicitCastExpr(hasSourceExpression(declRefExpr()))),hasRHS(integerLiteral().bind("secondvar2"))).bind("secondcondop")), ++ hasBody(compoundStmt(hasAnySubstatement( ++ forStmt(hasIncrement(unaryOperator().bind("thirdop")), ++ hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral().bind("thirdvar1"))).bind("thirdvar")))), ++ hasCondition(binaryOperator(hasLHS(implicitCastExpr(hasSourceExpression(declRefExpr()))),hasRHS(integerLiteral().bind("thirdvar2"))).bind("thirdcondop")), ++ hasBody(compoundStmt( ++ hasAnySubstatement(binaryOperator(findAll( ++ binaryOperator( ++ hasOperatorName("*"), ++ hasLHS(implicitCastExpr(hasSourceExpression( ++ arraySubscriptExpr( ++ hasBase(implicitCastExpr( ++ hasSourceExpression(arraySubscriptExpr( ++ hasIndex(implicitCastExpr( ++ hasSourceExpression(declRefExpr(to(varDecl().bind("matrixA_idx1"))) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ), ++ hasIndex(implicitCastExpr( ++ hasSourceExpression(declRefExpr(declRefExpr(to(varDecl().bind("matrixA_idx2"))))) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ) ++ , ++ hasRHS(implicitCastExpr(hasSourceExpression( ++ arraySubscriptExpr( ++ hasBase(implicitCastExpr( ++ hasSourceExpression(arraySubscriptExpr( ++ hasIndex(implicitCastExpr( ++ hasSourceExpression(declRefExpr(declRefExpr(to(varDecl().bind("matrixB_idx1")))) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ), ++ hasIndex(implicitCastExpr( ++ hasSourceExpression(declRefExpr(declRefExpr(to(varDecl().bind("matrixB_idx2"))))) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ) ++ ).bind("operator"))))) ++ ) ++ ).bind("thirdfor"))) ++ ) ++ ++ ++ ).bind("secondfor"))) ++ ) ++ ++ ++ ).bind("firstfor"); ++ ++class Matrix_ident : public MatchFinder::MatchCallback { ++public: ++ ++ ++ virtual void run(const MatchFinder::MatchResult& Result)override ++ { ++ cout<<"ident success"<("matrixA_idx1"); ++ VarDecl const * MatrixA_Idx2 = Result.Nodes.getNodeAs("matrixA_idx2"); ++ VarDecl const * MatrixB_Idx1 = Result.Nodes.getNodeAs("matrixB_idx1"); ++ VarDecl const * MatrixB_Idx2 = Result.Nodes.getNodeAs("matrixB_idx2"); ++ BinaryOperator const * F_condop = Result.Nodes.getNodeAs("firstcondop"); ++ BinaryOperator const * S_condop = Result.Nodes.getNodeAs("secondcondop"); ++ BinaryOperator const * T_condop = Result.Nodes.getNodeAs("thirdcondop"); ++ UnaryOperator const * F_op =Result.Nodes.getNodeAs("firstop"); ++ UnaryOperator const * S_op =Result.Nodes.getNodeAs("secondop"); ++ UnaryOperator const * T_op =Result.Nodes.getNodeAs("thirdop"); ++ ++ ++ VarDecl const * FirstForCondVar = Result.Nodes.getNodeAs("firstvar"); ++ VarDecl const * SecondForCondVar = Result.Nodes.getNodeAs("secondvar"); ++ VarDecl const * ThirdForCondVar = Result.Nodes.getNodeAs("thirdvar"); ++ ++ ++ bool is_Firstvar_equal = false ,is_Secondvar_equal = false ,is_Thirdvar_equal = false; ++ string M_A1,M_A2,M_B1,M_B2,F_name,S_name,T_name; ++ M_A1 = MatrixA_Idx1->getName().str(); ++ M_A2 = MatrixA_Idx2->getName().str(); ++ M_B1 = MatrixB_Idx1->getName().str(); ++ M_B2 = MatrixB_Idx2->getName().str(); ++ F_name = FirstForCondVar->getName().str(); ++ S_name = SecondForCondVar->getName().str(); ++ T_name = ThirdForCondVar->getName().str(); ++ ++ if(F_name == M_A1 ||F_name == M_A2 ||F_name == M_B1 ||F_name == M_B2 ) ++ is_Firstvar_equal=true; ++ if(S_name == M_A1 ||S_name == M_A2 ||S_name == M_B1 ||S_name == M_B2 ) ++ is_Secondvar_equal=true; ++ if(T_name == M_A1 ||T_name == M_A2 ||T_name == M_B1 ||T_name == M_B2 ) ++ is_Thirdvar_equal=true; ++ ++ ++ ++ //cout<getOpcodeStr().str()<getOpcodeStr(F_op->getOpcode()).str()<getOpcodeStr().str(); ++ string S_condopStr = S_condop->getOpcodeStr().str(); ++ string T_condopStr = T_condop->getOpcodeStr().str(); ++ string F_opStr = F_op->getOpcodeStr(F_op->getOpcode()).str(); ++ string S_opStr = S_op->getOpcodeStr(S_op->getOpcode()).str(); ++ string T_opStr = T_op->getOpcodeStr(T_op->getOpcode()).str(); ++ ++ if(is_Firstvar_equal && is_Secondvar_equal && is_Thirdvar_equal && M_A1 != M_A2 && M_B1 != M_B2) ++ { ++ if((F_condopStr == "<" && F_opStr == "++") || (F_condopStr == ">" && F_opStr == "--")) ++ if((S_condopStr == "<" && S_opStr == "++") || (S_condopStr == ">" && S_opStr == "--")) ++ if((T_condopStr == "<" && T_opStr == "++") || (T_condopStr == ">" && T_opStr == "--")) ++ isMatrix = true; ++ } ++ ++ ++ if(isMatrix==true) ++ { ++ bool a_transpose = false,b_transpose = false; ++ ++ int a_rows = 0 , b_rows= 0 , a_columns = 0 , b_columns = 0; ++ cout<<"is a matrix"<("firstvar1"); ++ IntegerLiteral const * FirstVar2_ = Result.Nodes.getNodeAs("firstvar2"); ++ IntegerLiteral const * SecondVar1_ = Result.Nodes.getNodeAs("secondvar1"); ++ IntegerLiteral const * SecondVar2_ = Result.Nodes.getNodeAs("secondvar2"); ++ IntegerLiteral const * ThirdVar1_ = Result.Nodes.getNodeAs("thirdvar1"); ++ IntegerLiteral const * ThirdVar2_ = Result.Nodes.getNodeAs("thirdvar2"); ++ ++ if(M_A2 == M_B1) {a_transpose = false; b_transpose = false;} ++ if(M_A2 == M_B2) {a_transpose = false; b_transpose = true;} ++ if(M_A1 == M_B1) {a_transpose = true; b_transpose = false;} ++ if(M_A1 == M_B2) {a_transpose = true; b_transpose = true;} ++ ++ ++ ++ int FirstVar1 = FirstVar1_->getValue().getSExtValue(); ++ int FirstVar2 = FirstVar2_->getValue().getSExtValue(); ++ int SecondVar1 = SecondVar1_->getValue().getSExtValue(); ++ int SecondVar2 = SecondVar2_->getValue().getSExtValue(); ++ int ThirdVar1 = ThirdVar1_->getValue().getSExtValue(); ++ int ThirdVar2 = ThirdVar2_->getValue().getSExtValue(); ++ ++ int F_f = 1; ++ int S_f = 1; ++ int T_f = 1; ++ ++ if(F_opStr=="--") F_f = -1; ++ if(S_opStr=="--") S_f = -1; ++ if(T_opStr=="--") T_f = -1; ++ ++ ++ ++ if(M_A1 == F_name) a_rows = (FirstVar2 - FirstVar1) * F_f; ++ if(M_A1 == S_name) a_rows = (SecondVar2 - SecondVar1) * S_f; ++ if(M_A1 == T_name) a_rows = (ThirdVar2 - ThirdVar1) * T_f; ++ if(M_A2 == F_name) a_columns = (FirstVar2 - FirstVar1) * F_f; ++ if(M_A2 == S_name) a_columns = (SecondVar2 - SecondVar1) * S_f; ++ if(M_A2 == T_name) a_columns = (ThirdVar2 - ThirdVar1) * T_f; ++ if(M_B1 == F_name) b_rows = (FirstVar2 - FirstVar1) * F_f; ++ if(M_B1 == S_name) b_rows = (SecondVar2 - SecondVar1) * S_f; ++ if(M_B1 == T_name) b_rows = (ThirdVar2 - ThirdVar1) * T_f;; ++ if(M_B2 == F_name) b_columns = (FirstVar2 - FirstVar1) * F_f; ++ if(M_B2 == S_name) b_columns = (SecondVar2 - SecondVar1) * S_f;; ++ if(M_B2 == T_name) b_columns = (ThirdVar2 - ThirdVar1) * T_f; ++ ++ ++ ++ int t = 0; ++ if(a_transpose == true){ ++ t = a_rows ; a_rows = a_columns; a_columns = t; ++ } ++ if(b_transpose == true){ ++ t = b_rows ; b_rows = b_columns; b_columns = t; ++ } ++ ++ BinaryOperator const * mult = Result.Nodes.getNodeAs("Operator"); ++ //mult->set_is_matrix_mult(true); ++ ++ ++ Metadata_print(a_rows, a_columns, b_rows, b_columns, a_transpose, b_transpose); ++ ++ } ++ else cout<<"is not a martix"< - 12.0.1-4 +- Type: enhancement +- ID: NA +- SUG: NA +- DESC: Add Matrix multiplication recognition function + * Tue Aug 23 2022 guopeilin - 12.0.1-3 - Type: enhancement - ID: NA