9 Star 0 Fork 13

src-openEuler/pin-server

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0002-Refactoring-Code-refactoring-of-Communication-Subsys.patch 91.87 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595
From c1301cbec8465ef4c9c4df597ee46774b6da5715 Mon Sep 17 00:00:00 2001
From: wangding16 <wangding16@huawei.com>
Date: Wed, 8 Feb 2023 15:13:54 +0800
Subject: [PATCH 02/23] [Refactoring] Code refactoring of Communication
Subsystem [2/3]. Code refactoring of PluginServer.
diff --git a/include/PluginServer/PluginLog.h b/include/PluginServer/PluginLog.h
index 716e08a..ece7067 100644
--- a/include/PluginServer/PluginLog.h
+++ b/include/PluginServer/PluginLog.h
@@ -16,13 +16,18 @@
Create: 2022-08-18
Description:
This file contains the declaration of the Plugin_Log class.
+ 主要完成功能:提供LOGE、LOGW、LOGI、LOGD四个log保存接口,并提供SetLogPriority接口
+ 设置log级别
*/
#ifndef PLUGIN_LOG_H
#define PLUGIN_LOG_H
-namespace PinServer {
-#define LOG_FILE_SIZE (10 * 1024 * 1024)
+#include <string>
+#include <memory>
+
+namespace PinLog {
+using std::string;
enum LogPriority : uint8_t {
PRIORITY_ERROR = 0,
@@ -30,14 +35,38 @@ enum LogPriority : uint8_t {
PRIORITY_INFO,
PRIORITY_DEBUG
};
-void LogPrint(LogPriority priority, const char *tag, const char *fmt, ...);
-void CloseLog(void);
-bool SetLogPriority(LogPriority priority);
-
-#define LOGE(...) LogPrint(PRIORITY_ERROR, "ERROR:", __VA_ARGS__)
-#define LOGW(...) LogPrint(PRIORITY_WARN, "WARN:", __VA_ARGS__)
-#define LOGI(...) LogPrint(PRIORITY_INFO, "", __VA_ARGS__)
-#define LOGD(...) LogPrint(PRIORITY_DEBUG, "DEBUG:", __VA_ARGS__)
-} // namespace PinServer
+
+constexpr int LOG_BUF_SIZE = 102400;
+constexpr int BASE_DATE = 1900;
+class PluginLog {
+public:
+ PluginLog();
+ ~PluginLog()
+ {
+ CloseLog();
+ }
+ void CloseLog();
+ bool SetPriority(LogPriority pri);
+ void SetFileSize(unsigned int size)
+ {
+ logFileSize = size;
+ }
+ void LOGE(const char *fmt, ...);
+ void LOGW(const char *fmt, ...);
+ void LOGI(const char *fmt, ...);
+ void LOGD(const char *fmt, ...);
+ static PluginLog *GetInstance();
+
+private:
+ void LogPrint(LogPriority priority, const char *tag, const char *fmt);
+ void LogWrite(const char *tag, const char *msg);
+ void LogWriteFile(const string& data);
+ void GetLogFileName(string& fileName);
+ LogPriority priority;
+ unsigned int logFileSize;
+ std::shared_ptr<std::fstream> logFs;
+ char logBuf[LOG_BUF_SIZE];
+};
+} // namespace PinLog
#endif
diff --git a/include/PluginServer/PluginOptBase.h b/include/PluginServer/PluginOptBase.h
new file mode 100755
index 0000000..474d072
--- /dev/null
+++ b/include/PluginServer/PluginOptBase.h
@@ -0,0 +1,82 @@
+/* Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ Author: Mingchuan Wu and Yancheng Li
+ Create: 2022-08-18
+ Description:
+ This file contains the declaration of the PluginOptBase class.
+ 主要完成功能:提供优化基类,gate为进入条件,DoOptimize为执行函数,RegisterCallbacks为注册函数
+*/
+
+#ifndef PLUGIN_OPTBASE_H
+#define PLUGIN_OPTBASE_H
+
+#include "PluginServer/ManagerSetup.h"
+#include "Dialect/PluginDialect.h"
+#include "Dialect/PluginOps.h"
+#include "mlir/IR/MLIRContext.h"
+#include "mlir/IR/Builders.h"
+
+namespace PluginOpt {
+enum InjectPoint : uint8_t {
+ HANDLE_PARSE_TYPE = 0,
+ HANDLE_PARSE_DECL,
+ HANDLE_PRAGMAS,
+ HANDLE_PARSE_FUNCTION,
+ HANDLE_BEFORE_IPA,
+ HANDLE_AFTER_IPA,
+ HANDLE_BEFORE_EVERY_PASS,
+ HANDLE_AFTER_EVERY_PASS,
+ HANDLE_BEFORE_ALL_PASS,
+ HANDLE_AFTER_ALL_PASS,
+ HANDLE_COMPILE_END,
+ HANDLE_MANAGER_SETUP,
+ HANDLE_INCLUDE_FILE,
+ HANDLE_MAX,
+};
+
+class PluginOptBase {
+public:
+ PluginOptBase(InjectPoint inject)
+ {
+ this->inject = inject;
+ context.getOrLoadDialect<mlir::Plugin::PluginDialect>();
+ }
+ virtual ~PluginOptBase() = default;
+ virtual bool Gate() = 0;
+ virtual int DoOptimize() = 0;
+ InjectPoint GetInject()
+ {
+ return inject;
+ }
+ void SetFuncAddr(uint64_t add)
+ {
+ func = add;
+ }
+ uint64_t GetFuncAddr(void)
+ {
+ return func;
+ }
+ mlir::MLIRContext *GetContext()
+ {
+ return &(this->context);
+ }
+
+private:
+ mlir::MLIRContext context;
+ InjectPoint inject;
+ uint64_t func; // 保存managerSetup fun参数指针
+};
+} // namespace PluginOpt
+#endif
diff --git a/include/PluginServer/PluginServer.h b/include/PluginServer/PluginServer.h
index ba659be..b651140 100644
--- a/include/PluginServer/PluginServer.h
+++ b/include/PluginServer/PluginServer.h
@@ -16,6 +16,8 @@
Create: 2022-08-18
Description:
This file contains the declaration of the PluginServer class.
+ 主要完成功能:完成和server之间grpc数据解析,提供接口函数获取client数据,提供注册
+ 函数完成用户事件注册,并在对应事件触发时回调用户函数
*/
#ifndef PLUGIN_SERVER_H
@@ -30,22 +32,25 @@
#include <json/json.h>
#include <grpcpp/grpcpp.h>
-#include "Dialect/PluginOps.h"
#include "plugin.grpc.pb.h"
+#include "Dialect/PluginOps.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/IR/Builders.h"
#include "Dialect/PluginTypes.h"
-namespace PinServer {
-using grpc::Server;
-using grpc::ServerBuilder;
-using grpc::ServerContext;
-using grpc::ServerReaderWriter;
-using grpc::Status;
+#include "PluginServer/PluginLog.h"
+#include "PluginServer/PluginCom.h"
+#include "PluginServer/PluginOptBase.h"
-using plugin::PluginService;
+namespace PinServer {
+using PinLog::PluginLog;
+using PinLog::LogPriority;
+using PinCom::PluginCom;
using plugin::ClientMsg;
using plugin::ServerMsg;
+using PluginOpt::InjectPoint;
+using PluginOpt::ManagerSetup;
+using PluginOpt::PluginOptBase;
using std::vector;
using std::string;
@@ -60,250 +65,211 @@ typedef enum {
STATE_TIMEOUT,
} UserFunStateEnum;
-typedef std::function<void(void)> UserFunc;
-enum InjectPoint : uint8_t {
- HANDLE_PARSE_TYPE = 0,
- HANDLE_PARSE_DECL,
- HANDLE_PRAGMAS,
- HANDLE_PARSE_FUNCTION,
- HANDLE_BEFORE_IPA,
- HANDLE_AFTER_IPA,
- HANDLE_BEFORE_EVERY_PASS,
- HANDLE_AFTER_EVERY_PASS,
- HANDLE_BEFORE_ALL_PASS,
- HANDLE_AFTER_ALL_PASS,
- HANDLE_COMPILE_END,
- HANDLE_MANAGER_SETUP,
- HANDLE_MAX,
-};
-
-// 参考点名称
-enum RefPassName {
- PASS_CFG,
- PASS_PHIOPT,
- PASS_SSA,
- PASS_LOOP,
-};
-
-enum PassPosition {
- PASS_INSERT_AFTER,
- PASS_INSERT_BEFORE,
- PASS_REPLACE,
-};
-
-struct ManagerSetupData {
- RefPassName refPassName;
- int passNum; // 指定passName的第几次执行作为参考点
- PassPosition passPosition; // 指定pass是添加在参考点之前还是之后
-};
-
-class RecordedUserFunc {
+class RecordedOpt {
public:
- RecordedUserFunc () = default;
- ~RecordedUserFunc () = default;
- RecordedUserFunc (const string& name, UserFunc func)
+ RecordedOpt() = default;
+ ~RecordedOpt() = default;
+ RecordedOpt(const string& name, std::shared_ptr<PluginOptBase> opt)
{
this->name = name;
- this->func = func;
+ this->opt = opt;
}
- string GetName(void)
+ RecordedOpt(const string& name, const string& param, std::shared_ptr<PluginOptBase> opt)
+ {
+ this->name = name;
+ this->param = param;
+ this->opt = opt;
+ }
+ string GetName()
{
return name;
}
- UserFunc GetFunc(void)
+ string GetParam()
{
- return func;
+ return param;
+ }
+ std::shared_ptr<PluginOptBase> GetOpt()
+ {
+ return opt;
}
private:
string name;
- UserFunc func;
+ string param;
+ std::shared_ptr<PluginOptBase> opt;
};
-class PluginServer final : public PluginService::Service {
+class PluginServer {
public:
- PluginServer() : opBuilder(&context){}
- /* 定义的grpc服务端和客户端通信的接口函数 */
- Status ReceiveSendMsg(ServerContext* context, ServerReaderWriter<ServerMsg, ClientMsg>* stream) override;
- /* 服务端发送数据给client接口 */
- void ServerSend(ServerReaderWriter<ServerMsg, ClientMsg>* stream, const string& key, const string& value);
+ PluginServer(LogPriority priority, const string& port)
+ {
+ userFunState = STATE_WAIT_BEGIN;
+ sem_init(&clientWaitSem, 0, 0);
+ sem_init(&clientReturnSem, 0, 0);
+ log = PluginLog::GetInstance();
+ log->SetPriority(priority);
+ this->port = port;
+ pluginServerPtr = this;
+ }
+ ~PluginServer()
+ {
+ sem_destroy(&clientWaitSem);
+ sem_destroy(&clientReturnSem);
+ log->LOGI("server ppid:%d quit!\n", getppid());
+ }
/* 处理从client接收到的消息 */
- int ClientMsgProc(ServerReaderWriter<ServerMsg, ClientMsg>* stream, const string& attribute, const string& value);
- /* 获取server对象实例,有且只有一个实例对象 */
- static PluginServer *GetInstance(void);
- vector<mlir::Plugin::FunctionOp> GetFunctionOpResult(void);
- vector<mlir::Plugin::LocalDeclOp> GetLocalDeclResult(void);
- mlir::Plugin::LoopOp LoopOpResult(void);
- vector<mlir::Plugin::LoopOp> LoopOpsResult(void);
- vector<std::pair<mlir::Block*, mlir::Block*> > EdgesResult(void);
- std::pair<mlir::Block*, mlir::Block*> EdgeResult(void);
- vector<mlir::Operation *> GetOpResult(void);
- bool GetBoolResult(void);
- void EraseBlock(mlir::Block*);
- uint64_t GetBlockResult(mlir::Block*);
- uint64_t GetIdResult(void);
- vector<uint64_t> GetIdsResult(void);
- mlir::Value GetValueResult(void);
- vector<mlir::Plugin::PhiOp> GetPhiOpsResult(void);
- mlir::Block* FindBlock(uint64_t);
- uint64_t FindBasicBlock(mlir::Block*);
- bool InsertValue(uint64_t, mlir::Value);
- mlir::Operation* FindDefOperation(uint64_t);
- void InsertCreatedBlock(uint64_t, mlir::Block*);
+ int ClientMsgProc(const string& attribute, const string& value);
+ mlir::MLIRContext *GetContext()
+ {
+ return this->context;
+ }
+ void SetOpBuilder(mlir::OpBuilder *builder)
+ {
+ this->opBuilder = builder;
+ }
+ mlir::OpBuilder *GetOpBuilder()
+ {
+ return this->opBuilder;
+ }
/* 回调函数接口,用于向server注册用户需要执行的函数 */
- int RegisterUserFunc(InjectPoint inject, UserFunc func);
- int RegisterPassManagerSetup(InjectPoint inject, const ManagerSetupData& passData, UserFunc func);
- /* 执行用户注册的回调函数,根据value查找对应的函数,value格式 InjectPoint:funName */
- void ExecFunc(const string& value);
- /* 将注册点和函数名发到客户端, stream为grpc当前数据流指针 */
- void SendRegisteredUserFunc(ServerReaderWriter<ServerMsg, ClientMsg>* stream);
- bool GetShutdownFlag(void)
+ bool RegisterOpt(std::shared_ptr<PluginOptBase> optBase);
+ bool RegisterPassManagerOpt(ManagerSetup& passData, std::shared_ptr<PluginOptBase> optBase);
+ map<string, string>& GetArgs()
{
- return shutdown;
+ return args;
}
- void SetShutdownFlag(bool flag)
+ /* 执行用户注册的回调函数,根据value查找对应的函数,value格式 InjectPoint:funName */
+ void ExecFunc(const string& value);
+ void RunServer();
+ /* 获取server对象实例,有且只有一个实例对象 */
+ static PluginServer *GetInstance(void);
+
+ int64_t GetIntegerDataResult(const string& funName, const string& params)
{
- shutdown = flag;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetIntegerDataResult();
}
- void SetApiFuncName(const string& name)
+ string GetStringDataResult(const string& funName, const string& params)
{
- apiFuncName = name;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetStringDataResult();
}
- void SetApiFuncParams(const string& params)
+ vector<mlir::Plugin::FunctionOp> GetFunctionOpResult(const string& funName, const string& params)
{
- apiFuncParams = params;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetFunctionOpResult();
}
- string &GetApiFuncName(void)
+ vector<mlir::Plugin::LocalDeclOp> GetLocalDeclResult(const string& funName, const string& params)
{
- return apiFuncName;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetLocalDeclResult();
}
- string &GetApiFuncParams(void)
+ mlir::Plugin::LoopOp LoopOpResult(const string& funName, const string& params)
{
- return apiFuncParams;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.LoopOpResult();
}
- void SetUserFunState(UserFunStateEnum state)
+ vector<mlir::Plugin::LoopOp> LoopOpsResult(const string& funName, const string& params)
{
- userFunState = state;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.LoopOpsResult();
}
- UserFunStateEnum GetUserFunState(void)
+ vector<std::pair<mlir::Block*, mlir::Block*> > EdgesResult(const string& funName, const string& params)
{
- return userFunState;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.EdgesResult();
}
- void SetTimeout(int time)
+ std::pair<mlir::Block*, mlir::Block*> EdgeResult(const string& funName, const string& params)
{
- timeout = time;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.EdgeResult();
}
- void FuncOpJsonDeSerialize(const string& data);
- Json::Value TypeJsonSerialize(PluginIR::PluginTypeBase& type);
- PluginIR::PluginTypeBase TypeJsonDeSerialize(const string& data);
- void LocalDeclOpJsonDeSerialize(const string& data);
- void LoopOpsJsonDeSerialize(const string& data);
- void LoopOpJsonDeSerialize(const string& data);
- void EdgesJsonDeSerialize(const string& data);
- void EdgeJsonDeSerialize(const string& data);
- void IdsJsonDeSerialize(const string& data);
- void CallOpJsonDeSerialize(const string& data);
- void CondOpJsonDeSerialize(const string& data);
- void RetOpJsonDeSerialize(const string& data);
- mlir::Value SSAOpJsonDeSerialize(const string& data);
- void FallThroughOpJsonDeSerialize(const string& data);
- void PhiOpJsonDeSerialize(const string& data);
- void AssignOpJsonDeSerialize(const string& data);
- void GetPhiOpsJsonDeSerialize(const string& data);
- void OpJsonDeSerialize(const string& data);
- mlir::Value ValueJsonDeSerialize(Json::Value valueJson);
- mlir::Value MemRefDeSerialize(const string& data);
- /* json反序列化,根据key值分别调用Operation/Decl/Type反序列化接口函数 */
- void JsonDeSerialize(const string& key, const string& data);
- /* 解析客户端发送过来的-fplugin-arg参数,并保存在私有变量args中 */
- void ParseArgv(const string& data);
- void TimerInit(void); // 超时定时器初始化
- void TimerStart(int interval); // 启动定时器,interval为0表示关闭定时器
- map<string, string>& GetArgs(void)
+ vector<mlir::Operation *> GetOpResult(const string& funName, const string& params)
{
- return args;
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetOpResult();
}
- /* 将json格式数据解析成map<string, string>格式 */
- void JsonGetAttributes(Json::Value node, map<string, string>& attributes);
- void SemInit(void)
+ bool GetBoolResult(const string& funName, const string& params)
{
- sem_init(&sem[0], 0, 0);
- sem_init(&sem[1], 0, 0);
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetBoolResult();
}
- void SemPost(void) // 开始执行用户函数或者用户函数结束触发该信号量
+ uint64_t GetIdResult(const string& funName, const string& params)
{
- sem_post(&sem[0]);
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetIdResult();
}
- void SemWait(void)
+ vector<uint64_t> GetIdsResult(const string& funName, const string& params)
{
- sem_wait(&sem[0]);
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetIdsResult();
}
- void ClientReturnSemPost(void) // client返回数据后触发该信号量
+ mlir::Value GetValueResult(const string& funName, const string& params)
{
- sem_post(&sem[1]);
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetValueResult();
}
- void ClientReturnSemWait(void)
+ vector<mlir::Plugin::PhiOp> GetPhiOpsResult(const string& funName, const string& params)
{
- sem_wait(&sem[1]);
+ RemoteCallClientWithAPI(funName, params);
+ return pluginCom.GetPhiOpsResult();
}
- void SemDestroy(void)
+
+ uint64_t GetBlockResult(mlir::Block*);
+ void EraseBlock(mlir::Block*);
+ mlir::Block* FindBlock(uint64_t);
+ void InsertCreatedBlock(uint64_t, mlir::Block*);
+ bool HaveBlock(uint64_t id)
{
- sem_destroy(&sem[0]);
- sem_destroy(&sem[1]);
+ return this->blockMaps.find(id) != this->blockMaps.end();
}
- void SetOpBuilder(mlir::OpBuilder builder) { this->opBuilder = builder; }
void ClearMaps()
{
valueMaps.clear();
blockMaps.clear();
basicblockMaps.clear();
defOpMaps.clear();
- idsResult.clear();
- opData.clear();
- edges.clear();
- loops.clear();
- decls.clear();
- funcOpData.clear();
- opBuilder = mlir::OpBuilder(&context);
}
+ uint64_t FindBasicBlock(mlir::Block*);
+ bool InsertValue(uint64_t, mlir::Value);
+ bool HaveValue(uint64_t);
+ mlir::Value GetValue(uint64_t);
+ mlir::Operation* FindDefOperation(uint64_t);
+ bool InsertDefOperation(uint64_t, mlir::Operation*);
+ void RemoteCallClientWithAPI(const string& api, const string& params);
+
private:
- bool shutdown; // 是否关闭server
/* 用户函数执行状态,client返回结果后为STATE_RETURN,开始执行下一个函数 */
volatile UserFunStateEnum userFunState;
- mlir::MLIRContext context;
- mlir::OpBuilder opBuilder;
- vector<mlir::Plugin::FunctionOp> funcOpData;
- PluginIR::PluginTypeBase pluginType;
- vector<mlir::Plugin::LocalDeclOp> decls;
- vector<mlir::Plugin::LoopOp> loops;
- mlir::Plugin::LoopOp loop;
- vector<std::pair<mlir::Block*, mlir::Block*> > edges;
- std::pair<mlir::Block*, mlir::Block*> edge;
- vector<mlir::Operation *> opData;
- bool boolResult;
- uint64_t idResult;
- vector<uint64_t> idsResult;
- mlir::Value valueResult;
+ mlir::MLIRContext *context;
+ mlir::OpBuilder* opBuilder = nullptr;
+
/* 保存用户注册的回调函数,它们将在注入点事件触发后调用 */
- map<InjectPoint, vector<RecordedUserFunc>> userFunc;
+ map<InjectPoint, vector<RecordedOpt>> userOpts;
string apiFuncName; // 保存用户调用PluginAPI的函数名
string apiFuncParams; // 保存用户调用PluginAPI函数的参数
- int timeout;
- timer_t timerId;
- map<string, string> args; // 保存gcc编译时用户传入参数
- sem_t sem[2];
+ string port; // server使用的端口号
+ map<string, string> args; // 保存client编译时用户传入参数
+ sem_t clientWaitSem; // 等待client结果信号量
+ sem_t clientReturnSem; // client返回结果信号量
+ PluginCom pluginCom;
+ PluginLog *log;
std::map<uint64_t, mlir::Value> valueMaps;
// process Block.
std::map<uint64_t, mlir::Block*> blockMaps;
std::map<mlir::Block*, uint64_t> basicblockMaps;
std::map<uint64_t, mlir::Operation*> defOpMaps;
- bool ProcessBlock(mlir::Block*, mlir::Region&, const Json::Value&);
+ /* 解析客户端发送过来的-fplugin-arg参数,并保存在私有变量args中 */
+ void ParseArgv(const string& data);
+ void ServerSemPost(const string& port); // server服务起来后通知client
+ /* 将注册点和函数名发到客户端, stream为grpc当前数据流指针 */
+ void SendRegisteredUserOpts();
+ void ExecCallbacks(const string& name);
+ static PluginServer *pluginServerPtr;
}; // class PluginServer
-
-void RunServer(int timeout, string& port);
} // namespace PinServer
#endif
diff --git a/lib/PluginServer/PluginCom.cpp b/lib/PluginServer/PluginCom.cpp
new file mode 100755
index 0000000..ab171c7
--- /dev/null
+++ b/lib/PluginServer/PluginCom.cpp
@@ -0,0 +1,164 @@
+/* Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ Author: Mingchuan Wu and Yancheng Li
+ Create: 2022-08-18
+ Description:
+ This file contains the implementation of the PluginCom class.
+ 主要完成功能:和client之间通信、数据解析、数据反序列化
+*/
+
+#include "PluginServer/PluginCom.h"
+#include "PluginServer/PluginLog.h"
+
+namespace PinCom {
+int64_t PluginCom::GetIntegerDataResult(void)
+{
+ int64_t result = integerResult;
+ integerResult = 0; // clear
+ return result;
+}
+
+string PluginCom::GetStringDataResult(void)
+{
+ string result = stringResult;
+ stringResult.clear(); // clear
+ return result;
+}
+
+vector<mlir::Plugin::FunctionOp> PluginCom::GetFunctionOpResult(void)
+{
+ vector<mlir::Plugin::FunctionOp> retOps = this->funcOpData;
+ this->funcOpData.clear();
+ this->opData.clear();
+ return retOps;
+}
+
+vector<mlir::Operation *> PluginCom::GetOpResult(void)
+{
+ vector<mlir::Operation *> retOps = opData;
+ opData.clear();
+ return retOps;
+}
+
+vector<mlir::Plugin::LocalDeclOp> PluginCom::GetLocalDeclResult(void)
+{
+ vector<mlir::Plugin::LocalDeclOp> retOps = decls;
+ decls.clear();
+ return retOps;
+}
+
+vector<mlir::Plugin::LoopOp> PluginCom::LoopOpsResult(void)
+{
+ vector<mlir::Plugin::LoopOp> retLoops = loops;
+ loops.clear();
+ return retLoops;
+}
+
+mlir::Plugin::LoopOp PluginCom::LoopOpResult(void)
+{
+ mlir::Plugin::LoopOp retLoop = loop;
+ return retLoop;
+}
+
+std::pair<mlir::Block*, mlir::Block*> PluginCom::EdgeResult()
+{
+ std::pair<mlir::Block*, mlir::Block*> e;
+ e.first = edge.first;
+ e.second = edge.second;
+ return e;
+}
+
+vector<std::pair<mlir::Block*, mlir::Block*> > PluginCom::EdgesResult()
+{
+ vector<std::pair<mlir::Block*, mlir::Block*> > retEdges;
+ retEdges = edges;
+ edges.clear();
+ return retEdges;
+}
+
+bool PluginCom::GetBoolResult()
+{
+ return this->boolResult;
+}
+
+uint64_t PluginCom::GetIdResult()
+{
+ return this->idResult;
+}
+
+vector<uint64_t> PluginCom::GetIdsResult()
+{
+ vector<uint64_t> retIds = idsResult;
+ idsResult.clear();
+ return retIds;
+}
+
+mlir::Value PluginCom::GetValueResult()
+{
+ return this->valueResult;
+}
+
+vector<mlir::Plugin::PhiOp> PluginCom::GetPhiOpsResult()
+{
+ vector<mlir::Plugin::PhiOp> retOps;
+ for (auto item : opData) {
+ mlir::Plugin::PhiOp p = llvm::dyn_cast<mlir::Plugin::PhiOp>(item);
+ retOps.push_back(p);
+ }
+ opData.clear();
+ return retOps;
+}
+
+void PluginCom::JsonDeSerialize(const string& key, const string& data)
+{
+ if (key == "FuncOpResult") {
+ json.FuncOpJsonDeSerialize(data, this->funcOpData);
+ } else if (key == "LocalDeclOpResult") {
+ json.LocalDeclOpJsonDeSerialize(data, this->decls);
+ } else if (key == "LoopOpResult") {
+ this->loop = json.LoopOpJsonDeSerialize (data);
+ } else if (key == "LoopOpsResult") {
+ json.LoopOpsJsonDeSerialize (data, this->loops);
+ } else if (key == "BoolResult") {
+ this->boolResult = (bool)atol(data.c_str());
+ } else if (key == "VoidResult") {
+ ;
+ } else if (key == "EdgeResult") {
+ json.EdgeJsonDeSerialize(data, this->edge);
+ } else if (key == "EdgesResult") {
+ json.EdgesJsonDeSerialize(data, this->edges);
+ } else if (key == "IdsResult") {
+ json.IdsJsonDeSerialize(data, this->idsResult);
+ } else if (key == "IdResult") {
+ this->idResult = atol(data.c_str());
+ } else if (key == "OpsResult") {
+ json.OpJsonDeSerialize(data.c_str(), this->opData);
+ } else if (key == "ValueResult") {
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ this->valueResult = json.ValueJsonDeSerialize(node);
+ } else if (key == "GetPhiOps") {
+ json.GetPhiOpsJsonDeSerialize(data, this->opData);
+ } else if (key == "IntegerResult") {
+ json.IntegerDeSerialize(data, integerResult);
+ } else if (key == "StringResult") {
+ json.StringDeSerialize(data, stringResult);
+ } else {
+ PinLog::PluginLog::GetInstance()->LOGE("not Json,key:%s,value:%s\n", key.c_str(), data.c_str());
+ }
+}
+} // namespace PinCom
+
diff --git a/lib/PluginServer/PluginGrpc.cpp b/lib/PluginServer/PluginGrpc.cpp
new file mode 100755
index 0000000..659b3ef
--- /dev/null
+++ b/lib/PluginServer/PluginGrpc.cpp
@@ -0,0 +1,82 @@
+/* Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ Author: Mingchuan Wu and Yancheng Li
+ Create: 2022-08-18
+ Description:
+ This file contains the implementation of the PluginGrpc class.
+ 主要完成功能:完成grpc server服务的注册,提供server和client之间grpc收发接口
+*/
+
+#include <thread>
+#include "PluginServer/PluginServer.h"
+
+namespace PinGrpc {
+void PluginGrpc::ServerSend(const string& key, const string& value)
+{
+ ServerMsg serverMsg;
+ serverMsg.set_attribute(key);
+ serverMsg.set_value(value);
+ grpcStream->Write(serverMsg);
+}
+
+Status PluginGrpc::ReceiveSendMsg(ServerContext* context, ServerReaderWriter<ServerMsg, ClientMsg>* stream)
+{
+ ClientMsg clientMsg;
+ grpcStream = stream;
+
+ while (stream->Read(&clientMsg)) {
+ PinServer::PluginServer::GetInstance()->ClientMsgProc(clientMsg.attribute(), clientMsg.value());
+ }
+ return Status::OK;
+}
+
+void PluginGrpc::ServerMonitorThread()
+{
+ int delay = 100000; // 100ms
+ pid_t initPid = 1;
+ while (1) {
+ if (shutdown || (getppid() == initPid)) {
+ grpcServer->Shutdown();
+ break;
+ }
+ usleep(delay);
+ }
+}
+
+bool PluginGrpc::RegisterServer(const string& port)
+{
+ string serverAddress = "0.0.0.0:" + port;
+ ServerBuilder builder;
+ int serverPort = 0;
+ // Listen on the given address without any authentication mechanism.
+ builder.AddListeningPort(serverAddress, grpc::InsecureServerCredentials(), &serverPort);
+ builder.RegisterService(this);
+ grpcServer = std::unique_ptr<Server>(builder.BuildAndStart());
+ if (serverPort != atoi(port.c_str())) {
+ return false;
+ }
+ return true;
+}
+
+void PluginGrpc::Run()
+{
+ std::thread serverExtiThread(&PluginGrpc::ServerMonitorThread, this);
+ serverExtiThread.join();
+
+ // Wait for the server to shutdown. Note that some other thread must be
+ // responsible for shutting down the server for this call to ever return.
+ grpcServer->Wait();
+}
+} // namespace PinGrpc
diff --git a/lib/PluginServer/main.cpp b/lib/PluginServer/main.cpp
index 5ec007b..fac574e 100644
--- a/lib/PluginServer/main.cpp
+++ b/lib/PluginServer/main.cpp
@@ -19,15 +19,20 @@
*/
#include "PluginServer/PluginServer.h"
-#include "PluginServer/PluginLog.h"
+
+using namespace PinServer;
int main(int argc, char** argv)
{
- int timeout = atoi(argv[0]);
- std::string port = argv[1];
- PinServer::LogPriority priority = (PinServer::LogPriority)atoi(argv[2]);
- PinServer::SetLogPriority(priority);
- PinServer::RunServer(timeout, port);
- PinServer::CloseLog();
+ const int argcNum = 2; // 参数只有2个,argv[0]:port argv[1]:log级别
+ if (argc != argcNum) {
+ printf("param num:%d, should be:%d\n", argc, argcNum);
+ return -1;
+ }
+ printf("main arg: %s, %s\n", argv[0], argv[1]);
+ std::string port = argv[0];
+ LogPriority priority = (LogPriority)atoi(argv[1]);
+ PluginServer server(priority, port);
+ server.RunServer();
return 0;
}
\ No newline at end of file
diff --git a/user.cpp b/user.cpp
index cdb0b99..a6fe555 100644
--- a/user.cpp
+++ b/user.cpp
@@ -27,7 +27,9 @@
#include "PluginAPI/PluginServerAPI.h"
#include "PluginServer/PluginLog.h"
#include "PluginAPI/ControlFlowAPI.h"
+#include "PluginServer/PluginOptBase.h"
+namespace PluginOpt {
using std::string;
using std::vector;
using std::cout;
@@ -83,15 +85,13 @@ static void PassManagerSetupFunc(void)
printf("PassManagerSetupFunc in\n");
}
-enum EDGE_FLAG
-{
+enum EDGE_FLAG {
EDGE_FALLTHRU,
EDGE_TRUE_VALUE,
EDGE_FALSE_VALUE
};
-struct edgeDef
-{
+struct edgeDef {
Block *src;
Block *dest;
unsigned destIdx;
@@ -100,84 +100,74 @@ struct edgeDef
typedef struct edgeDef edge;
typedef struct edgeDef *edgePtr;
-static vector<Block *>
-getPredecessors (Block *bb)
+static vector<Block *> getPredecessors(Block *bb)
{
vector<Block *> preds;
- for (auto it = bb->pred_begin(); it != bb->pred_end(); ++it)
- {
+ for (auto it = bb->pred_begin(); it != bb->pred_end(); ++it) {
Block *pred = *it;
preds.push_back(pred);
}
return preds;
}
-static unsigned
-getNumPredecessor (Block *bb)
+static unsigned getNumPredecessor(Block *bb)
{
vector<Block *> preds = getPredecessors(bb);
return preds.size();
}
-static unsigned
-getIndexPredecessor (Block *bb, Block *pred)
+static unsigned getIndexPredecessor(Block *bb, Block *pred)
{
unsigned i;
vector<Block *> preds = getPredecessors(bb);
- for (i = 0; i < getNumPredecessor(bb); i++)
- {
- if (preds[i] == pred)
- break;
+ for (i = 0; i < getNumPredecessor(bb); i++) {
+ if (preds[i] == pred) {
+ break;
+ }
}
return i;
}
-static enum EDGE_FLAG
-getEdgeFlag (Block *src, Block *dest)
+static enum EDGE_FLAG GetEdgeFlag(Block *src, Block *dest)
{
Operation *op = src->getTerminator();
enum EDGE_FLAG flag;
- if (isa<FallThroughOp>(op))
- {
+ if (isa<FallThroughOp>(op)) {
flag = EDGE_FALLTHRU;
}
- if (isa<CondOp>(op))
- {
- if (op->getSuccessor(0) == dest)
+ if (isa<CondOp>(op)) {
+ if (op->getSuccessor(0) == dest) {
flag = EDGE_TRUE_VALUE;
- else
+ } else {
flag = EDGE_FALSE_VALUE;
+ }
}
return flag;
}
-static vector<edge>
-getPredEdges (Block *bb)
+static vector<edge> GetPredEdges(Block *bb)
{
unsigned i = 0;
vector<edge> edges;
- for (auto it = bb->pred_begin(); it != bb->pred_end(); ++it)
- {
+ for (auto it = bb->pred_begin(); it != bb->pred_end(); ++it) {
Block *pred = *it;
edge e;
e.src = pred;
e.dest = bb;
e.destIdx = i;
- e.flag = getEdgeFlag(bb, pred);
+ e.flag = GetEdgeFlag(bb, pred);
edges.push_back(e);
i++;
}
return edges;
}
-static edge
-getEdge (Block *src, Block *dest)
+static edge GetEdge(Block *src, Block *dest)
{
- vector<edge> edges = getPredEdges (dest);
+ vector<edge> edges = GetPredEdges(dest);
edge e;
- for (auto elm : edges)
- {
+ for (auto elm : edges) {
if (elm.src == src) {
e = elm;
break;
@@ -186,24 +176,21 @@ getEdge (Block *src, Block *dest)
return e;
}
-static unsigned
-getEdgeDestIdx (Block *src, Block *dest)
+static unsigned GetEdgeDestIdx(Block *src, Block *dest)
{
- edge e = getEdge(src, dest);
+ edge e = GetEdge(src, dest);
return e.destIdx;
}
-static bool
-isEqualEdge (edge e1, edge e2)
+static bool IsEqualEdge(edge e1, edge e2)
{
- if (e1.src == e2.src && e1.dest == e2.dest && e1.destIdx == e2.destIdx
- && e1.flag == e2.flag)
+ if (e1.src == e2.src && e1.dest == e2.dest && e1.destIdx == e2.destIdx && e1.flag == e2.flag) {
return true;
+ }
return false;
}
-static IDefineCode
-getValueDefCode (Value v)
+static IDefineCode getValueDefCode(Value v)
{
IDefineCode rescode;
if (auto ssaop = dyn_cast<SSAOp>(v.getDefiningOp())) {
@@ -212,16 +199,14 @@ getValueDefCode (Value v)
rescode = memop.defCode().getValue();
} else if (auto constop = dyn_cast<ConstOp>(v.getDefiningOp())) {
rescode = constop.defCode().getValue();
- }else {
+ } else {
auto holderop = dyn_cast<PlaceholderOp>(v.getDefiningOp());
rescode = holderop.defCode().getValue();
}
- // assert(rescode == IDefineCode::UNDEF);
return rescode;
}
-static uint64_t
-getValueId (Value v)
+static uint64_t getValueId(Value v)
{
uint64_t resid;
if (auto ssaop = dyn_cast<SSAOp>(v.getDefiningOp())) {
@@ -230,15 +215,14 @@ getValueId (Value v)
resid = memop.id();
} else if (auto constop = dyn_cast<ConstOp>(v.getDefiningOp())) {
resid = constop.id();
- }else {
+ } else {
auto holderop = dyn_cast<PlaceholderOp>(v.getDefiningOp());
resid = holderop.id();
}
return resid;
}
-static PluginIR::PluginTypeBase
-getPluginTypeofValue (Value v)
+static PluginIR::PluginTypeBase getPluginTypeofValue(Value v)
{
PluginIR::PluginTypeBase type;
if (auto ssaop = dyn_cast<SSAOp>(v.getDefiningOp())) {
@@ -247,15 +231,14 @@ getPluginTypeofValue (Value v)
type = memop.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
} else if (auto constop = dyn_cast<ConstOp>(v.getDefiningOp())) {
type = constop.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- }else {
+ } else {
auto holderop = dyn_cast<PlaceholderOp>(v.getDefiningOp());
type = holderop.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
}
return type;
}
-static bool
-isValueExist (Value v)
+static bool isValueExist(Value v)
{
uint64_t vid = getValueId(v);
if (vid != 0) {
@@ -264,60 +247,58 @@ isValueExist (Value v)
return false;
}
-static bool
-isEqualValue (Value v1, Value v2)
+static bool isEqualValue(Value v1, Value v2)
{
uint64_t v1id = getValueId(v1);
uint64_t v2id = getValueId(v2);
- if (v1id != 0 && v2id != 0 && v1id == v2id)
+ if (v1id != 0 && v2id != 0 && v1id == v2id) {
return true;
+ }
return false;
}
-static bool
-isSingleRhsAssignOp (Operation *op)
+static bool isSingleRhsAssignOp(Operation *op)
{
- if (!isa<AssignOp>(op))
+ if (!isa<AssignOp>(op)) {
return false;
- if (op->getNumOperands() == 2)
+ }
+ if (op->getNumOperands() == 2) {
return true;
+ }
return false;
}
-static bool
-isBinaryRhsAssignOp (Operation *op)
+static bool isBinaryRhsAssignOp(Operation *op)
{
- if (!isa<AssignOp>(op))
+ if (!isa<AssignOp>(op)) {
return false;
- if (op->getNumOperands() == 3)
+ }
+ if (op->getNumOperands() == 3) {
return true;
+ }
return false;
}
-static IDefineCode
-getSingleRhsAssignOpCode (Operation *op)
+static IDefineCode getSingleRhsAssignOpCode(Operation *op)
{
auto assignOp = dyn_cast<AssignOp>(op);
Value v = assignOp.GetRHS1();
return getValueDefCode(v);
}
-static IExprCode
-getBinaryRhsAssignOpCode (Operation *op)
+static IExprCode getBinaryRhsAssignOpCode(Operation *op)
{
auto assignOp = dyn_cast<AssignOp>(op);
return assignOp.exprCode();
}
-static int64_t
-getRealValueIntCST (Value v)
+static int64_t getRealValueIntCST(Value v)
{
auto constOp = dyn_cast<ConstOp>(v.getDefiningOp());
return constOp.initAttr().cast<mlir::IntegerAttr>().getInt();
}
-static Operation *
-getSSADefStmtofValue (Value v)
+static Operation *getSSADefStmtofValue(Value v)
{
if (!isa<SSAOp>(v.getDefiningOp())) {
return NULL;
@@ -330,17 +311,16 @@ getSSADefStmtofValue (Value v)
return op;
}
-struct originLoopInfo
-{
- Value base; /* The initial index of the array in the old loop. */
+struct originLoopInfo {
+ Value base; /* The initial index of the array in the old loop. */
Value *baseptr;
- Value limit; /* The limit index of the array in the old loop. */
+ Value limit; /* The limit index of the array in the old loop. */
Value *limitptr;
- Value arr1; /* Array 1 in the old loop. */
+ Value arr1; /* Array 1 in the old loop. */
Value *arr1ptr;
- Value arr2; /* Array 2 in the old loop. */
+ Value arr2; /* Array 2 in the old loop. */
Value *arr2ptr;
- edge entryEdge; /* The edge into the old loop. */
+ edge entryEdge; /* The edge into the old loop. */
edgePtr entryEdgePtr;
Block *exitBB1;
Block *exitBB2;
@@ -352,10 +332,9 @@ struct originLoopInfo
Operation *condOp2;
Operation *updateStmt;
bool existPrologAssgin;
- /* Whether the marker has an initial value assigned
- to the array index. */
+ /* Whether the marker has an initial value assigned to the array index. */
uint64_t step;
- /* The growth step of the loop induction variable. */
+ /* The growth step of the loop induction variable. */
};
typedef struct originLoopInfo originLoopInfo;
@@ -363,32 +342,31 @@ typedef struct originLoopInfo originLoopInfo;
static originLoopInfo originLoop;
/* Return true if the loop has precisely one backedge. */
-
-static bool
-isLoopSingleBackedge (LoopOp loop)
+static bool isLoopSingleBackedge(LoopOp loop)
{
Block *latch = loop.GetLatch();
unsigned numSucc = latch->getNumSuccessors();
- if (numSucc != 1)
+ if (numSucc != 1) {
return false;
+ }
Block *header = loop.GetHeader();
Block *latchSuccBB = latch->getSuccessor(numSucc-1);
- if (latchSuccBB != header)
+ if (latchSuccBB != header) {
return false;
+ }
return true;
}
/* Return true if the loop has precisely one preheader BB. */
-
-static bool
-isLoopSinglePreheaderBB (LoopOp loop)
+static bool isLoopSinglePreheaderBB(LoopOp loop)
{
Block *header = loop.GetHeader();
- if (getNumPredecessor(header) != 2)
+ if (getNumPredecessor(header) != 2) {
return false;
+ }
vector<Block *> preds = getPredecessors(header);
Block *headerPred1 = preds[0];
@@ -396,39 +374,37 @@ isLoopSinglePreheaderBB (LoopOp loop)
Block *latch = loop.GetLatch();
if ((headerPred1 == latch && !loop.IsLoopFather(headerPred2))
- || (headerPred2 == latch && !loop.IsLoopFather(headerPred1)))
+ || (headerPred2 == latch && !loop.IsLoopFather(headerPred1))) {
return true;
+ }
return false;
}
/* Initialize the originLoop structure. */
-static void
-initOriginLoopStructure ()
+static void InitOriginLoopStructure()
{
- originLoop.baseptr = nullptr;
- originLoop.limitptr = nullptr;
- originLoop.arr1ptr = nullptr;
- originLoop.arr2ptr = nullptr;
- originLoop.exitE1Ptr = nullptr;
- originLoop.exitE2Ptr = nullptr;
- originLoop.exitBB1 = nullptr;
- originLoop.exitBB2 =nullptr;
- originLoop.entryEdgePtr = nullptr;
- originLoop.condOp1 = nullptr;
- originLoop.condOp2 = nullptr;
- originLoop.updateStmt = nullptr;
- originLoop.existPrologAssgin = false;
- originLoop.step = 0;
+ originLoop.baseptr = nullptr;
+ originLoop.limitptr = nullptr;
+ originLoop.arr1ptr = nullptr;
+ originLoop.arr2ptr = nullptr;
+ originLoop.exitE1Ptr = nullptr;
+ originLoop.exitE2Ptr = nullptr;
+ originLoop.exitBB1 = nullptr;
+ originLoop.exitBB2 =nullptr;
+ originLoop.entryEdgePtr = nullptr;
+ originLoop.condOp1 = nullptr;
+ originLoop.condOp2 = nullptr;
+ originLoop.updateStmt = nullptr;
+ originLoop.existPrologAssgin = false;
+ originLoop.step = 0;
}
-static vector<edge>
-getLoopExitEdges (LoopOp loop)
+static vector<edge> getLoopExitEdges(LoopOp loop)
{
vector<std::pair<Block *, Block *>> bbPairInfo = loop.GetExitEdges();
vector<edge> edges;
for (auto elm : bbPairInfo) {
- edge e;
- e = getEdge(elm.first, elm.second);
+ edge e = GetEdge(elm.first, elm.second);
edges.push_back(e);
}
return edges;
@@ -436,51 +412,53 @@ getLoopExitEdges (LoopOp loop)
/* Make sure the exit condition stmt satisfies a specific form. */
-static bool
-checkCondOp (Operation *op)
+static bool checkCondOp(Operation *op)
{
- if (!op)
+ if (!op) {
return false;
- if (!isa<CondOp>(op))
+ }
+ if (!isa<CondOp>(op)) {
return false;
+ }
auto cond = dyn_cast<CondOp>(op);
- if (cond.condCode() != IComparisonCode::ne
- && cond.condCode() != IComparisonCode::eq)
+ if (cond.condCode() != IComparisonCode::ne && cond.condCode() != IComparisonCode::eq) {
return false;
+ }
Value lhs = cond.GetLHS();
Value rhs = cond.GetRHS();
-
- if (getValueDefCode(lhs) != IDefineCode::SSA
- || getValueDefCode(rhs) != IDefineCode::SSA)
+ if (getValueDefCode(lhs) != IDefineCode::SSA || getValueDefCode(rhs) != IDefineCode::SSA) {
return false;
+ }
- return true;
+ return true;
}
/* Record the exit information in the original loop including exit edge,
exit bb block, exit condition stmt,
- eg: exit_eX origin_exit_bbX cond_stmtX. */
+ eg: exitEX originLoop.exitBBX condOpX. */
-static bool
-recordOriginLoopExitInfo (LoopOp loop)
+static bool recordOriginLoopExitInfo(LoopOp loop)
{
bool found = false;
Operation *op;
if (originLoop.exitE1Ptr != nullptr || originLoop.exitBB1 != nullptr
|| originLoop.exitE2Ptr != nullptr || originLoop.exitBB2 != nullptr
- || originLoop.condOp1 != nullptr || originLoop.condOp2 != nullptr)
+ || originLoop.condOp1 != nullptr || originLoop.condOp2 != nullptr) {
return false;
+ }
vector<edge> exitEdges = getLoopExitEdges (loop);
- if (exitEdges.empty())
+ if (exitEdges.empty()) {
return false;
+ }
- if (exitEdges.size() != 2)
+ if (exitEdges.size() != 2) {
return false;
+ }
for (auto e : exitEdges) {
if (e.src == loop.GetHeader()) {
originLoop.exitE1 = e;
@@ -502,21 +480,19 @@ recordOriginLoopExitInfo (LoopOp loop)
}
}
}
-
-
- if (originLoop.exitE1Ptr != nullptr && originLoop.exitBB1 != nullptr
+ if (originLoop.exitE1Ptr != nullptr && originLoop.exitBB1 != nullptr
&& originLoop.exitE2Ptr != nullptr && originLoop.exitBB2 != nullptr
- && originLoop.condOp1 != nullptr && originLoop.condOp2 != nullptr)
- found = true;
+ && originLoop.condOp1 != nullptr && originLoop.condOp2 != nullptr) {
+ found = true;
+ }
- return found;
+ return found;
}
/* Get the edge that first entered the loop. */
-static edge
-getLoopPreheaderEdge (LoopOp loop)
+static edge getLoopPreheaderEdge(LoopOp loop)
{
Block *header = loop.GetHeader();
vector<Block *> preds = getPredecessors(header);
@@ -529,54 +505,56 @@ getLoopPreheaderEdge (LoopOp loop)
}
}
- edge e = getEdge(src, header);
+ edge e = GetEdge(src, header);
return e;
}
-/* Returns true if t is SSA_NAME and user variable exists. */
+/* Returns true if t is SSAOp and user variable exists. */
-static bool
-isSSANameVar (Value v)
+static bool isSSANameVar(Value v)
{
- if (!isValueExist(v) || getValueDefCode(v) != IDefineCode::SSA)
+ if (!isValueExist(v) || getValueDefCode(v) != IDefineCode::SSA) {
return false;
+ }
auto ssaOp = dyn_cast<SSAOp>(v.getDefiningOp());
uint64_t varid = ssaOp.nameVarId();
- if (varid != 0)
+ if (varid != 0) {
return true;
+ }
return false;
}
-/* Returns true if t1 and t2 are SSA_NAME and belong to the same variable. */
+/* Returns true if t1 and t2 are SSAOp and belong to the same variable. */
-static bool
-isSameSSANameVar (Value v1, Value v2)
+static bool isSameSSANameVar(Value v1, Value v2)
{
- if (!isSSANameVar (v1) || !isSSANameVar (v2))
+ if (!isSSANameVar (v1) || !isSSANameVar (v2)) {
return false;
+ }
auto ssaOp1 = dyn_cast<SSAOp>(v1.getDefiningOp());
auto ssaOp2 = dyn_cast<SSAOp>(v2.getDefiningOp());
uint64_t varid1 = ssaOp1.nameVarId();
uint64_t varid2 = ssaOp2.nameVarId();
- if (varid1 == varid2)
+ if (varid1 == varid2) {
return true;
+ }
return false;
}
/* Get origin loop induction variable upper bound. */
-
-static bool
-getIvUpperBound (CondOp cond)
+static bool getIvUpperBound(CondOp cond)
{
- if (originLoop.limitptr != nullptr)
+ if (originLoop.limitptr != nullptr) {
return false;
+ }
Value lhs = cond.GetLHS();
Value rhs = cond.GetRHS();
-
- if (!getPluginTypeofValue(lhs).isa<PluginIR::PluginIntegerType>() || !getPluginTypeofValue(rhs).isa<PluginIR::PluginIntegerType>())
+ if (!getPluginTypeofValue(lhs).isa<PluginIR::PluginIntegerType>()
+ || !getPluginTypeofValue(rhs).isa<PluginIR::PluginIntegerType>()) {
return false;
+ }
originLoop.limit = rhs;
originLoop.limitptr = &originLoop.limit;
@@ -587,18 +565,16 @@ getIvUpperBound (CondOp cond)
return false;
}
-/* Returns true only when the expression on the rhs code of stmt is PLUS_EXPR,
- rhs1 is SSA_NAME with the same var as originLoop base, and rhs2 is
- INTEGER_CST. */
-
-static bool
-checkUpdateStmt (Operation *op)
+/* Returns true only when the expression on the rhs code of stmt is PLUS,
+ rhs1 is SSAOp with the same var as originLoop base, and rhs2 is
+ ConstOp. */
+static bool checkUpdateStmt(Operation *op)
{
- if (!op || !isa<AssignOp>(op))
+ if (!op || !isa<AssignOp>(op)) {
return false;
+ }
auto assignOp = dyn_cast<AssignOp>(op);
if (assignOp.exprCode() == IExprCode::Plus) {
-
Value rhs1 = assignOp.GetRHS1();
Value rhs2 = assignOp.GetRHS2();
if (getValueDefCode(rhs1) == IDefineCode::SSA
@@ -615,42 +591,43 @@ checkUpdateStmt (Operation *op)
}
/* Get origin loop induction variable initial value. */
-
-static bool
-getIvBase (CondOp cond)
+static bool getIvBase(CondOp cond)
{
- if (originLoop.baseptr != nullptr || originLoop.updateStmt != nullptr)
+ if (originLoop.baseptr != nullptr || originLoop.updateStmt != nullptr) {
return false;
+ }
Value lhs = cond.GetLHS();
-
Block *header = cond.getOperation()->getBlock();
-
auto &opList = header->getOperations();
for (auto it = opList.begin(); it != opList.end(); ++it) {
Operation *op = &(*it);
- if (!isa<PhiOp>(op))
+ if (!isa<PhiOp>(op)) {
continue;
+ }
auto phi = dyn_cast<PhiOp>(op);
Value result = phi.GetResult();
- if (!isSameSSANameVar (result, lhs))
+ if (!isSameSSANameVar (result, lhs)) {
continue;
+ }
Value base = phi.GetArgDef(originLoop.entryEdge.destIdx);
- if (!isSameSSANameVar (base, lhs))
+ if (!isSameSSANameVar (base, lhs)) {
return false;
+ }
originLoop.base = base;
originLoop.baseptr = &originLoop.base;
- vector<edge> edges = getPredEdges(header);
+ vector<edge> edges = GetPredEdges(header);
for (auto e : edges) {
-
- if (!isEqualEdge(e, originLoop.entryEdge)) {
+ if (!IsEqualEdge(e, originLoop.entryEdge)) {
Value ivAfter = phi.GetArgDef(e.destIdx);
- if (!isa<SSAOp>(ivAfter.getDefiningOp()))
+ if (!isa<SSAOp>(ivAfter.getDefiningOp())) {
return false;
+ }
Operation *op = getSSADefStmtofValue(ivAfter);
- if (!checkUpdateStmt (op))
+ if (!checkUpdateStmt (op)) {
return false;
+ }
originLoop.updateStmt = op;
if (op->getBlock() == header && isEqualValue(ivAfter, lhs)) {
originLoop.existPrologAssgin = true;
@@ -672,60 +649,58 @@ getIvBase (CondOp cond)
......
For such a loop, ++len will be processed before entering header_bb, and the
assign is regarded as the prolog_assign of the loop. */
-
-static bool
-recordOriginLoopHeader (LoopOp loop)
+static bool recordOriginLoopHeader(LoopOp loop)
{
Block *header = loop.GetHeader();
-
if (originLoop.entryEdgePtr != nullptr || originLoop.baseptr != nullptr
- || originLoop.updateStmt != nullptr || originLoop.limitptr != nullptr)
+ || originLoop.updateStmt != nullptr || originLoop.limitptr != nullptr) {
return false;
+ }
originLoop.entryEdge = getLoopPreheaderEdge (loop);
originLoop.entryEdgePtr = &originLoop.entryEdge;
auto &opList = header->getOperations();
for (auto it = opList.rbegin(); it != opList.rend(); ++it) {
Operation *op = &(*it);
- if (isa<PhiOp, SSAOp, PlaceholderOp, ConstOp>(op))
+ if (isa<PhiOp, SSAOp, PlaceholderOp, ConstOp>(op)) {
continue;
+ }
if (auto cond = dyn_cast<CondOp>(op)) {
- if (!getIvUpperBound (cond))
+ if (!getIvUpperBound(cond)) {
return false;
- if (!getIvBase (cond))
+ }
+ if (!getIvBase(cond)) {
return false;
+ }
} else if (auto assign = dyn_cast<AssignOp>(op)) {
-
if (op != originLoop.updateStmt || !originLoop.existPrologAssgin) {
return false;
}
- }
- else {
+ } else {
return false;
}
}
- if (originLoop.entryEdgePtr != nullptr && originLoop.baseptr != nullptr
+ if (originLoop.entryEdgePtr != nullptr && originLoop.baseptr != nullptr
&& originLoop.updateStmt != nullptr && originLoop.limitptr != nullptr) {
return true;
}
- return false;
+ return false;
}
/* When prolog_assign does not exist, make sure that updateStmt exists in the
loop latch, and its form is a specific form, eg:
len_2 = len_1 + 1. */
-
-static bool
-recordOriginLoopLatch (LoopOp loop)
+static bool recordOriginLoopLatch(LoopOp loop)
{
Block *latch = loop.GetLatch();
Operation *op = latch->getTerminator();
if (originLoop.existPrologAssgin) {
- if (isa<FallThroughOp>(op))
+ if (isa<FallThroughOp>(op)) {
return true;
+ }
}
// Todo: else分支处理别的场景,待添加
@@ -733,14 +708,13 @@ recordOriginLoopLatch (LoopOp loop)
return false;
}
-/* Returns true when the DEF_STMT corresponding to arg0 of the mem_ref tree
- satisfies the POINTER_PLUS_EXPR type. */
-
-static bool
-checkBodyMemRef (Value memRef)
+/* Returns true when the define STMT corresponding to arg0 of the MemOp
+ satisfies the PtrPlus type. */
+static bool checkBodyMemRef(Value memRef)
{
- if(getValueDefCode(memRef) != IDefineCode::MemRef)
+ if (getValueDefCode(memRef) != IDefineCode::MemRef) {
return false;
+ }
auto memOp = dyn_cast<MemOp>(memRef.getDefiningOp());
Value realarg0 = memOp.GetBase();
@@ -748,7 +722,6 @@ checkBodyMemRef (Value memRef)
PluginServerAPI pluginapi;
Value arg0 = pluginapi.ConfirmValue(realarg0);
Value arg1 = pluginapi.ConfirmValue(realarg1);
-
if (getPluginTypeofValue(arg0).isa<PluginIR::PluginPointerType>()
&& getValueDefCode(arg1) == IDefineCode::IntCST
&& getRealValueIntCST(arg1) == 0) {
@@ -762,9 +735,7 @@ checkBodyMemRef (Value memRef)
/* Returns true if the rh2 of the current stmt comes from the base in the
original loop. */
-
-static bool
-checkBodyPointerPlus (Operation *op, Value &tmpIndex)
+static bool checkBodyPointerPlus(Operation *op, Value &tmpIndex)
{
auto assignOp = dyn_cast<AssignOp>(op);
Value rhs1 = assignOp.GetRHS1();
@@ -775,17 +746,17 @@ checkBodyPointerPlus (Operation *op, Value &tmpIndex)
if (g && isSingleRhsAssignOp(g) && getBinaryRhsAssignOpCode(g) == IExprCode::Nop) {
auto nopOp = dyn_cast<AssignOp>(g);
Value nopRhs = nopOp.GetRHS1();
-
if (isSameSSANameVar(nopRhs, originLoop.base)) {
if (!originLoop.arr1ptr) {
originLoop.arr1 = rhs1;
originLoop.arr1ptr = &originLoop.arr1;
tmpIndex = rhs2;
- } else if(!originLoop.arr2ptr) {
- originLoop.arr2 = rhs1;
- originLoop.arr2ptr = &originLoop.arr2;
- if (!isEqualValue(tmpIndex, rhs2))
- return false;
+ } else if (!originLoop.arr2ptr) {
+ originLoop.arr2 = rhs1;
+ originLoop.arr2ptr = &originLoop.arr2;
+ if (!isEqualValue(tmpIndex, rhs2)) {
+ return false;
+ }
} else {
return false;
}
@@ -796,15 +767,11 @@ checkBodyPointerPlus (Operation *op, Value &tmpIndex)
return false;
}
-
/* Record the array comparison information in the original loop, while ensuring
- that there are only statements related to cont_stmt in the loop body. */
-
-static bool
-recordOriginLoopBody (LoopOp loop)
+ that there are only statements related to cont stmt in the loop body. */
+static bool recordOriginLoopBody(LoopOp loop)
{
Block *body = originLoop.condOp2->getBlock();
-
map<Operation*, bool> visited;
for (auto &op : *body) {
visited[&op] = false;
@@ -813,8 +780,9 @@ recordOriginLoopBody (LoopOp loop)
Value condLhs = dyn_cast<CondOp>(originLoop.condOp2).GetLHS();
Value condRhs = dyn_cast<CondOp>(originLoop.condOp2).GetRHS();
if (!(getPluginTypeofValue(condLhs).isa<PluginIR::PluginIntegerType>())
- || !(getPluginTypeofValue(condRhs).isa<PluginIR::PluginIntegerType>()))
+ || !(getPluginTypeofValue(condRhs).isa<PluginIR::PluginIntegerType>())) {
return false;
+ }
vector<Value> worklist;
worklist.push_back(condLhs);
@@ -822,63 +790,68 @@ recordOriginLoopBody (LoopOp loop)
Value tmpIndex;
visited[originLoop.condOp2] = true;
- while (!worklist.empty())
- {
+ while (!worklist.empty()) {
Value v = worklist.back();
worklist.pop_back();
Operation *op = getSSADefStmtofValue(v);
- if (!op || op->getBlock() != body || !isa<AssignOp>(op))
+ if (!op || op->getBlock() != body || !isa<AssignOp>(op)) {
continue;
+ }
visited[op] = true;
if (isSingleRhsAssignOp(op) && getSingleRhsAssignOpCode(op) == IDefineCode::MemRef) {
auto assignopmem = dyn_cast<AssignOp>(op);
Value memRef = assignopmem.GetRHS1();
- if (!checkBodyMemRef(memRef))
+ if (!checkBodyMemRef(memRef)) {
return false;
+ }
auto memOp = dyn_cast<MemOp>(memRef.getDefiningOp());
Value arg0 = memOp.GetBase();
- worklist.push_back(arg0);//memref arg0
- }else if (isBinaryRhsAssignOp(op) && getBinaryRhsAssignOpCode(op) == IExprCode::PtrPlus) {
+ worklist.push_back(arg0); // memref arg0
+ } else if (isBinaryRhsAssignOp(op) && getBinaryRhsAssignOpCode(op) == IExprCode::PtrPlus) {
auto assignop2 = dyn_cast<AssignOp>(op);
Value rhs2 = assignop2.GetRHS2();
- if (!checkBodyPointerPlus(op, tmpIndex))
+ if (!checkBodyPointerPlus(op, tmpIndex)) {
return false;
+ }
worklist.push_back(rhs2);
- }else if (isSingleRhsAssignOp(op) && getBinaryRhsAssignOpCode(op) == IExprCode::Nop){
+ } else if (isSingleRhsAssignOp(op) && getBinaryRhsAssignOpCode(op) == IExprCode::Nop) {
auto assignop = dyn_cast<AssignOp>(op);
Value rhs = assignop.GetRHS1();
- if (!isSameSSANameVar(rhs, originLoop.base))
+ if (!isSameSSANameVar(rhs, originLoop.base)) {
return false;
+ }
worklist.push_back(rhs);
- }else {
+ } else {
return false;
}
}
bool allvisited = true;
- if (allvisited)
+ if (allvisited) {
return true;
+ }
return false;
}
/* Returns true only if the exit bb of the original loop is unique and its phi
node parameter comes from the same variable. */
-
-static bool
-checkExitBB (LoopOp loop)
+static bool checkExitBB(LoopOp loop)
{
- if (originLoop.exitBB1 != originLoop.exitBB2
- || loop.IsBlockInside (originLoop.exitBB1))
- return false;
+ if (originLoop.exitBB1 != originLoop.exitBB2
+ || loop.IsBlockInside (originLoop.exitBB1)) {
+ return false;
+ }
for (auto &op : *originLoop.exitBB1) {
- if (!isa<PhiOp>(op))
+ if (!isa<PhiOp>(op)) {
continue;
+ }
auto phi = dyn_cast<PhiOp>(op);
Value result = phi.GetResult();
- if (!isSameSSANameVar(result, originLoop.base))
+ if (!isSameSSANameVar(result, originLoop.base)) {
continue;
+ }
if (phi.nArgs() == 2) {
Value arg0 = phi.GetArgDef(0);
Value arg1 = phi.GetArgDef(1);
@@ -892,131 +865,122 @@ checkExitBB (LoopOp loop)
/* Make sure that the recorded originLoop information meets the
relative requirements. */
-
-static bool
-checkOriginLoopInfo (LoopOp loop)
+static bool checkOriginLoopInfo(LoopOp loop)
{
- if (!checkExitBB (loop))
+ if (!checkExitBB (loop)) {
return false;
+ }
- if (getValueDefCode(originLoop.base) != IDefineCode::SSA)
+ if (getValueDefCode(originLoop.base) != IDefineCode::SSA) {
return false;
+ }
- if (getValueDefCode(originLoop.limit) != IDefineCode::SSA)
+ if (getValueDefCode(originLoop.limit) != IDefineCode::SSA) {
return false;
+ }
auto limitssaop = dyn_cast<SSAOp>(originLoop.limit.getDefiningOp());
-
- if (!limitssaop.readOnly().getValue())
+ if (!limitssaop.readOnly().getValue()) {
return false;
+ }
if (!getPluginTypeofValue(originLoop.arr1).isa<PluginIR::PluginPointerType>()
- || !getPluginTypeofValue(originLoop.arr2).isa<PluginIR::PluginPointerType>())
+ || !getPluginTypeofValue(originLoop.arr2).isa<PluginIR::PluginPointerType>()) {
return false;
+ }
auto arr1type = getPluginTypeofValue(originLoop.arr1).dyn_cast<PluginIR::PluginPointerType>();
auto arr2type = getPluginTypeofValue(originLoop.arr2).dyn_cast<PluginIR::PluginPointerType>();
-
- if (!arr1type.isReadOnlyElem() || !arr2type.isReadOnlyElem())
+ if (!arr1type.isReadOnlyElem() || !arr2type.isReadOnlyElem()) {
return false;
+ }
if (!arr1type.getElementType().isa<PluginIR::PluginIntegerType>()
- || !arr2type.getElementType().isa<PluginIR::PluginIntegerType>())
+ || !arr2type.getElementType().isa<PluginIR::PluginIntegerType>()) {
return false;
+ }
auto elemTy1 = arr1type.getElementType().dyn_cast<PluginIR::PluginIntegerType>();
auto elemTy2 = arr2type.getElementType().dyn_cast<PluginIR::PluginIntegerType>();
-
- if (elemTy1.getWidth() != 8 || elemTy2.getWidth() != 8)
+ if (elemTy1.getWidth() != 8 || elemTy2.getWidth() != 8) {
return false;
+ }
return true;
}
// /* Record the useful information of the original loop and judge whether the
// information meets the specified conditions. */
-
-static bool
-checkRecordLoopForm (LoopOp loop)
+static bool checkRecordLoopForm(LoopOp loop)
{
- if (!recordOriginLoopExitInfo (loop))
- {
+ if (!recordOriginLoopExitInfo (loop)) {
printf ("\nFailed to record loop exit information.\n");
return false;
}
- if (!recordOriginLoopHeader (loop))
- {
+ if (!recordOriginLoopHeader (loop)) {
printf ("\nFailed to record loop header information.\n");
return false;
}
- if (!recordOriginLoopLatch (loop))
- {
+ if (!recordOriginLoopLatch (loop)) {
printf ("\nFailed to record loop latch information.\n");
return false;
}
- if (!recordOriginLoopBody (loop))
- {
+ if (!recordOriginLoopBody (loop)) {
printf ("\nFailed to record loop body information.\n");
return false;
}
- if (!checkOriginLoopInfo (loop))
- {
+ if (!checkOriginLoopInfo (loop)) {
printf ("\nFailed to check origin loop information.\n");
return false;
}
- return true;
+ return true;
}
-static bool
-determineLoopForm(LoopOp loop)
+static bool determineLoopForm(LoopOp loop)
{
- if (loop.innerLoopIdAttr().getInt() != 0 && loop.numBlockAttr().getInt() != 3)
- {
+ if (loop.innerLoopIdAttr().getInt() != 0 && loop.numBlockAttr().getInt() != 3) {
printf ("\nWrong loop form, there is inner loop or redundant bb.\n");
return false;
}
- if (loop.GetSingleExit().first || !loop.GetLatch())
- {
+ if (loop.GetSingleExit().first || !loop.GetLatch()) {
printf ("\nWrong loop form, only one exit or loop_latch does not exist.\n");
return false;
}
- if (!isLoopSingleBackedge(loop))
- {
+ if (!isLoopSingleBackedge(loop)) {
printf ("\nWrong loop form, loop back edges are not unique.\n");
return false;
}
- if (!isLoopSinglePreheaderBB(loop))
- {
+ if (!isLoopSinglePreheaderBB(loop)) {
printf ("\nWrong loop form, loop preheader bb are not unique.\n");
return false;
}
- initOriginLoopStructure();
- if (!checkRecordLoopForm(loop))
+ InitOriginLoopStructure();
+ if (!checkRecordLoopForm(loop)) {
return false;
+ }
return true;
}
-
-static void
-update_loop_dominator(uint64_t dir, FunctionOp* funcOp)
+static void update_loop_dominator(uint64_t dir, FunctionOp* funcOp)
{
ControlFlowAPI cfAPI;
mlir::Region &region = funcOp->bodyRegion();
PluginServerAPI pluginAPI;
- for (auto &bb : region.getBlocks())
- {
+ for (auto &bb : region.getBlocks()) {
uint64_t bbAddr = pluginAPI.FindBasicBlock(&bb);
- if (bbAddr == 0) continue;
+ if (bbAddr == 0) {
+ continue;
+ }
uint64_t i_bbAddr = cfAPI.GetImmediateDominator(dir, bbAddr);
if (!i_bbAddr || &bb == originLoop.exitBB1) {
cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(&bb), \
@@ -1026,8 +990,7 @@ update_loop_dominator(uint64_t dir, FunctionOp* funcOp)
}
}
-static void
-remove_originLoop(LoopOp *loop, FunctionOp* funcOp)
+static void remove_originLoop(LoopOp *loop, FunctionOp* funcOp)
{
vector<mlir::Block*> body;
ControlFlowAPI controlapi;
@@ -1035,15 +998,13 @@ remove_originLoop(LoopOp *loop, FunctionOp* funcOp)
body = loop->GetLoopBody();
unsigned n = loop->numBlockAttr().getInt();
for (unsigned i = 0; i < n; i++) {
- // body[i]->erase();
controlapi.DeleteBlock(body[i], funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(body[i]));
}
loop->Delete();
}
-static void
-create_prolog_bb(
- Block *prolog_bb, Block *after_bb, Block *dominator_bb, LoopOp *outer, edge entryEdge, FunctionOp *funcOp, Block *ftBB)
+static void create_prolog_bb(Block *prolog_bb, Block *after_bb, Block *dominator_bb,
+ LoopOp *outer, edge entryEdge, FunctionOp *funcOp, Block *ftBB)
{
mlir::Value lhs1;
@@ -1052,14 +1013,14 @@ create_prolog_bb(
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(prolog_bb), outer->idAttr().getInt());
- FallThroughOp fp =llvm::dyn_cast<FallThroughOp>(entryEdge.src->back());
- pluginAPI.RedirectFallthroughTarget(fp, pluginAPI.FindBasicBlock(entryEdge.src), pluginAPI.FindBasicBlock(prolog_bb));
+ FallThroughOp fp = llvm::dyn_cast<FallThroughOp>(entryEdge.src->back());
+ pluginAPI.RedirectFallthroughTarget(fp, pluginAPI.FindBasicBlock(entryEdge.src),
+ pluginAPI.FindBasicBlock(prolog_bb));
cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(prolog_bb), pluginAPI.FindBasicBlock(dominator_bb));
SSAOp baseSsa = dyn_cast<mlir::Plugin::SSAOp>(originLoop.base.getDefiningOp());
lhs1 = baseSsa.Copy();
-
opBuilder->setInsertionPointToStart(prolog_bb);
llvm::SmallVector<mlir::Value> ops;
if (originLoop.existPrologAssgin) {
@@ -1069,8 +1030,7 @@ create_prolog_bb(
mlir::Value step = ConstOp::CreateConst(*opBuilder, attr, originLoop.base.getType());
ops.push_back(step);
AssignOp opa = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::Plus, prolog_bb);
- }
- else {
+ } else {
ops.push_back(lhs1);
ops.push_back(originLoop.base);
AssignOp op = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::Nop, prolog_bb);
@@ -1080,8 +1040,7 @@ create_prolog_bb(
defs_map.emplace(prolog_bb, lhs1);
}
-static void
-create_loop_pred_bb(
+static void create_loop_pred_bb(
Block *loop_pred_bb, Block* after_bb, Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
{
ControlFlowAPI cfAPI;
@@ -1095,8 +1054,7 @@ create_loop_pred_bb(
defs_map.emplace(loop_pred_bb, baseSsa.GetCurrentDef());
}
-static void
-create_align_loop_header(Block *align_loop_header, Block* after_bb,
+static void create_align_loop_header(Block *align_loop_header, Block* after_bb,
Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block* tb, Block* fb)
{
CondOp cond_stmt;
@@ -1114,11 +1072,11 @@ create_align_loop_header(Block *align_loop_header, Block* after_bb,
cfAPI.CreateNewDef(entry_node, phi.getOperation());
res = phi.GetResult();
-
opBuilder->setInsertionPointToStart(align_loop_header);
llvm::SmallVector<mlir::Value> ops;
- PluginIR::PluginTypeBase baseType = PluginIR::PluginIntegerType::get(context, 64, PluginIR::PluginIntegerType::Unsigned);
+ PluginIR::PluginTypeBase baseType = PluginIR::PluginIntegerType::get(context, 64,
+ PluginIR::PluginIntegerType::Unsigned);
ops.push_back(SSAOp::MakeSSA(*opBuilder, baseType));
ops.push_back(res);
AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::Nop, (align_loop_header));
@@ -1138,25 +1096,25 @@ create_align_loop_header(Block *align_loop_header, Block* after_bb,
ops.push_back(lhs2);
ops.push_back(lhs3);
- cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(), IComparisonCode::le, lhs2, lhs3, tb, fb, (align_loop_header));
+ cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(), IComparisonCode::le,
+ lhs2, lhs3, tb, fb, (align_loop_header));
baseSsa.SetCurrentDef(res);
defs_map.emplace(align_loop_header, res);
}
-static void
-rewrite_add_phi_arg(Block* bb)
+static void rewrite_add_phi_arg(Block* bb)
{
ControlFlowAPI cf;
PluginServerAPI pluginAPI;
vector<PhiOp> phis = cf.GetAllPhiOpInsideBlock(bb);
for (auto phi : phis) {
Value res = phi.GetResult();
- vector<Block *> bv = getPredecessors (bb);
+ vector<Block *> bv = getPredecessors (bb);
int j = 0;
for (int i = bv.size()-1; i>=0; i--) {
if (phi.GetArgDef(j++)) {
- continue;
+ continue;
}
Value var = (defs_map[bv[i]]);
@@ -1181,9 +1139,8 @@ static LoopOp *init_new_loop(LoopOp *outer_loop, Block* header, Block* latch, Fu
return new_loop;
}
-static void
-create_align_loop_body_bb(Block *align_loop_body_bb, Block* after_bb, Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp,
- Block* tb, Block* fb)
+static void create_align_loop_body_bb(Block *align_loop_body_bb, Block* after_bb, Block* dominator_bb,
+ LoopOp *outer, FunctionOp *funcOp, Block* tb, Block* fb)
{
CondOp cond_stmt;
Value lhs1, lhs2;
@@ -1192,27 +1149,32 @@ create_align_loop_body_bb(Block *align_loop_body_bb, Block* after_bb, Block* dom
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(align_loop_body_bb), outer->idAttr().getInt());
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(align_loop_body_bb), pluginAPI.FindBasicBlock(dominator_bb));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(align_loop_body_bb),
+ pluginAPI.FindBasicBlock(dominator_bb));
opBuilder->setInsertionPointToStart(align_loop_body_bb);
llvm::SmallVector<mlir::Value> ops;
SSAOp baseSsa = dyn_cast<mlir::Plugin::SSAOp>(originLoop.base.getDefiningOp());
- PluginIR::PluginTypeBase sizeType = PluginIR::PluginIntegerType::get(context, 64, PluginIR::PluginIntegerType::Unsigned);
+ PluginIR::PluginTypeBase sizeType = PluginIR::PluginIntegerType::get(context, 64,
+ PluginIR::PluginIntegerType::Unsigned);
ops.push_back(SSAOp::MakeSSA(*opBuilder, sizeType));
ops.push_back(baseSsa.GetCurrentDef());
- AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::Nop, (align_loop_body_bb));
+ AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::Nop, (align_loop_body_bb));
Value var = op1.GetLHS();
ops.clear();
ops.push_back(SSAOp::MakeSSA(*opBuilder, originLoop.arr2.getType()));
ops.push_back(originLoop.arr2);
ops.push_back(var);
- AssignOp op2 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::PtrPlus, (align_loop_body_bb));
+ AssignOp op2 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::PtrPlus, (align_loop_body_bb));
lhs1 = op2.GetLHS();
ops.clear();
- PluginIR::PluginTypeBase baseType = PluginIR::PluginIntegerType::get(context, 64, PluginIR::PluginIntegerType::Unsigned);
+ PluginIR::PluginTypeBase baseType = PluginIR::PluginIntegerType::get(context, 64,
+ PluginIR::PluginIntegerType::Unsigned);
PluginIR::PluginTypeBase pointerTy = PluginIR::PluginPointerType::get(context, baseType, 0);
ops.push_back(SSAOp::MakeSSA(*opBuilder, baseType));
mlir::Attribute asdada = opBuilder->getI64IntegerAttr(0);
@@ -1224,7 +1186,8 @@ create_align_loop_body_bb(Block *align_loop_body_bb, Block* after_bb, Block* dom
ops.push_back(SSAOp::MakeSSA(*opBuilder, originLoop.arr1.getType()));
ops.push_back(originLoop.arr1);
ops.push_back(var);
- AssignOp op4 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::PtrPlus, (align_loop_body_bb));
+ AssignOp op4 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::PtrPlus, (align_loop_body_bb));
lhs2 = op4.GetLHS();
ops.clear();
@@ -1232,15 +1195,16 @@ create_align_loop_body_bb(Block *align_loop_body_bb, Block* after_bb, Block* dom
ops.push_back(pluginAPI.BuildMemRef(
baseType, lhs2, ConstOp::CreateConst(*opBuilder, opBuilder->getI64IntegerAttr(0), pointerTy)));
- AssignOp op5 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::UNDEF, (align_loop_body_bb));
+ AssignOp op5 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::UNDEF, (align_loop_body_bb));
lhs2 = op5.GetLHS();
- cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(),
+ cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(),
llvm::dyn_cast<CondOp>(originLoop.condOp2).condCode(), lhs1, lhs2, tb, fb, (align_loop_body_bb));
}
-static void
-create_align_loop_latch(Block *align_loop_latch, Block* after_bb, Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
+static void create_align_loop_latch(Block *align_loop_latch, Block* after_bb, Block* dominator_bb,
+ LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
{
Value res;
ControlFlowAPI cfAPI;
@@ -1251,7 +1215,8 @@ create_align_loop_latch(Block *align_loop_latch, Block* after_bb, Block* dominat
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(align_loop_latch), outer->idAttr().getInt());
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(align_loop_latch), pluginAPI.FindBasicBlock(dominator_bb));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(align_loop_latch),
+ pluginAPI.FindBasicBlock(dominator_bb));
res = baseSsa.Copy();
@@ -1265,8 +1230,8 @@ create_align_loop_latch(Block *align_loop_latch, Block* after_bb, Block* dominat
defs_map.emplace(align_loop_latch, res);
}
-static void
-create_align_loop_exit_bb(Block *align_loop_exit_bb, Block* after_bb, Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
+static void create_align_loop_exit_bb(Block *align_loop_exit_bb, Block* after_bb, Block* dominator_bb,
+ LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
{
CondOp cond_stmt;
Value lhs1, lhs2;
@@ -1279,7 +1244,8 @@ create_align_loop_exit_bb(Block *align_loop_exit_bb, Block* after_bb, Block* dom
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(align_loop_exit_bb), outer->idAttr().getInt());
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(align_loop_exit_bb), pluginAPI.FindBasicBlock(dominator_bb));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(align_loop_exit_bb),
+ pluginAPI.FindBasicBlock(dominator_bb));
cond_stmt = llvm::dyn_cast<CondOp>(after_bb->back());
cond_lhs = cond_stmt.GetLHS();
@@ -1290,12 +1256,14 @@ create_align_loop_exit_bb(Block *align_loop_exit_bb, Block* after_bb, Block* dom
ops.push_back((SSAOp::MakeSSA(*opBuilder, cond_lhs.getType())));
ops.push_back(cond_lhs);
ops.push_back(cond_rhs);
- AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::BitXOR, (align_loop_exit_bb));
+ AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::BitXOR, (align_loop_exit_bb));
lhs1 = op1.GetLHS();
ops.clear();
ops.push_back(lhs1);
build_ctzll = opBuilder->create<CallOp>(opBuilder->getUnknownLoc(), ops, (align_loop_exit_bb));
- PluginIR::PluginTypeBase intType = PluginIR::PluginIntegerType::get(context, 32, PluginIR::PluginIntegerType::Signed);
+ PluginIR::PluginTypeBase intType =
+ PluginIR::PluginIntegerType::get(context, 32, PluginIR::PluginIntegerType::Signed);
lhs1 = SSAOp::MakeSSA(*opBuilder, intType);
build_ctzll.SetLHS(lhs1);
@@ -1325,8 +1293,8 @@ create_align_loop_exit_bb(Block *align_loop_exit_bb, Block* after_bb, Block* dom
defs_map.emplace(align_loop_exit_bb, lhs2);
}
-static void
-create_epilogue_loop_header(Block *epilogue_loop_header, Block* after_bb, Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block* tb, Block* fb)
+static void create_epilogue_loop_header(Block *epilogue_loop_header, Block* after_bb, Block* dominator_bb,
+ LoopOp *outer, FunctionOp *funcOp, Block* tb, Block* fb)
{
CondOp cond_stmt;
Value res;
@@ -1337,10 +1305,10 @@ create_epilogue_loop_header(Block *epilogue_loop_header, Block* after_bb, Block*
SSAOp baseSsa = dyn_cast<mlir::Plugin::SSAOp>(originLoop.base.getDefiningOp());
Value entry_node = baseSsa.GetCurrentDef();
-
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(epilogue_loop_header), outer->idAttr().getInt());
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(epilogue_loop_header), pluginAPI.FindBasicBlock(dominator_bb));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(epilogue_loop_header),
+ pluginAPI.FindBasicBlock(dominator_bb));
phi = PhiOp::CreatePhi(nullptr, epilogue_loop_header);
cfAPI.CreateNewDef(entry_node, phi.getOperation());
@@ -1348,17 +1316,16 @@ create_epilogue_loop_header(Block *epilogue_loop_header, Block* after_bb, Block*
opBuilder->setInsertionPointToStart(epilogue_loop_header);
- cond_stmt =
- opBuilder->create<CondOp>(opBuilder->getUnknownLoc(), llvm::dyn_cast<CondOp>(originLoop.condOp1).condCode(), res, originLoop.limit, tb, fb, (epilogue_loop_header));
+ cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(),
+ llvm::dyn_cast<CondOp>(originLoop.condOp1).condCode(), res, originLoop.limit, tb, fb, (epilogue_loop_header));
baseSsa.SetCurrentDef(res);
defs_map.emplace(epilogue_loop_header, res);
}
-static void
-create_epilogue_loop_body_bb(Block *epilogue_loop_body_bb, Block* after_bb, Block* dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block* tb, Block* fb)
+static void create_epilogue_loop_body_bb(Block *epilogue_loop_body_bb, Block* after_bb, Block* dominator_bb,
+ LoopOp *outer, FunctionOp *funcOp, Block* tb, Block* fb)
{
-
AssignOp g;
CondOp cond_stmt;
Value lhs1, lhs2, lhs3;
@@ -1368,30 +1335,35 @@ create_epilogue_loop_body_bb(Block *epilogue_loop_body_bb, Block* after_bb, Bloc
SSAOp baseSsa = dyn_cast<mlir::Plugin::SSAOp>(originLoop.base.getDefiningOp());
Value entry_node = baseSsa.GetCurrentDef();
-
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(epilogue_loop_body_bb), outer->idAttr().getInt());
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(epilogue_loop_body_bb), pluginAPI.FindBasicBlock(dominator_bb));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(epilogue_loop_body_bb),
+ pluginAPI.FindBasicBlock(dominator_bb));
opBuilder->setInsertionPointToStart(epilogue_loop_body_bb);
llvm::SmallVector<mlir::Value> ops;
- PluginIR::PluginTypeBase sizeType = PluginIR::PluginIntegerType::get(context, 64, PluginIR::PluginIntegerType::Unsigned);
+ PluginIR::PluginTypeBase sizeType = PluginIR::PluginIntegerType::get(context, 64,
+ PluginIR::PluginIntegerType::Unsigned);
ops.push_back(SSAOp::MakeSSA(*opBuilder, sizeType));
ops.push_back(entry_node);
- AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::Nop, (epilogue_loop_body_bb));
+ AssignOp op1 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::Nop, (epilogue_loop_body_bb));
lhs1 = op1.GetLHS();
ops.clear();
ops.push_back(SSAOp::MakeSSA(*opBuilder, originLoop.arr1.getType()));
ops.push_back(originLoop.arr1);
ops.push_back(lhs1);
- AssignOp op2 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::PtrPlus, (epilogue_loop_body_bb));
+ AssignOp op2 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::PtrPlus, (epilogue_loop_body_bb));
lhs2 = op2.GetLHS();
ops.clear();
- PluginIR::PluginTypeBase charType = PluginIR::PluginIntegerType::get(context, 8, PluginIR::PluginIntegerType::Unsigned);
+ PluginIR::PluginTypeBase charType = PluginIR::PluginIntegerType::get(context, 8,
+ PluginIR::PluginIntegerType::Unsigned);
ops.push_back(SSAOp::MakeSSA(*opBuilder, charType));
- ops.push_back(pluginAPI.BuildMemRef(charType, lhs2, ConstOp::CreateConst(*opBuilder, opBuilder->getI64IntegerAttr(0), lhs2.getType())));
+ ops.push_back(pluginAPI.BuildMemRef(charType, lhs2,
+ ConstOp::CreateConst(*opBuilder, opBuilder->getI64IntegerAttr(0), lhs2.getType())));
g = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::UNDEF, (epilogue_loop_body_bb));
lhs2 = g.GetLHS();
@@ -1400,37 +1372,37 @@ create_epilogue_loop_body_bb(Block *epilogue_loop_body_bb, Block* after_bb, Bloc
ops.push_back(SSAOp::MakeSSA(*opBuilder, originLoop.arr2.getType()));
ops.push_back(originLoop.arr2);
ops.push_back(lhs1);
- AssignOp op3 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::PtrPlus, (epilogue_loop_body_bb));
+ AssignOp op3 = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops,
+ IExprCode::PtrPlus, (epilogue_loop_body_bb));
lhs3 = op3.GetLHS();
ops.clear();
ops.push_back(SSAOp::MakeSSA(*opBuilder, charType));
- ops.push_back(pluginAPI.BuildMemRef(charType, lhs3, ConstOp::CreateConst(*opBuilder, opBuilder->getI64IntegerAttr(0), lhs3.getType())));
+ ops.push_back(pluginAPI.BuildMemRef(charType, lhs3, ConstOp::CreateConst(*opBuilder,
+ opBuilder->getI64IntegerAttr(0), lhs3.getType())));
g = opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::UNDEF, (epilogue_loop_body_bb));
Value res = g.GetLHS();
- cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(), llvm::dyn_cast<CondOp>(originLoop.condOp1).condCode(), res, originLoop.limit, tb, fb, (epilogue_loop_body_bb));
+ cond_stmt = opBuilder->create<CondOp>(opBuilder->getUnknownLoc(),
+ llvm::dyn_cast<CondOp>(originLoop.condOp1).condCode(), res, originLoop.limit, tb, fb, (epilogue_loop_body_bb));
defs_map.emplace(epilogue_loop_body_bb, baseSsa.GetCurrentDef());
}
-static void
-create_epilogue_loop_latch(Block *epilogue_loop_latch,
- Block *after_bb, Block *dominator_bb,
- LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
+static void create_epilogue_loop_latch(Block *epilogue_loop_latch,
+ Block *after_bb, Block *dominator_bb, LoopOp *outer, FunctionOp *funcOp, Block *ftBB)
{
-
Value res;
ControlFlowAPI cfAPI;
PluginServerAPI pluginAPI;
SSAOp baseSsa = dyn_cast<mlir::Plugin::SSAOp>(originLoop.base.getDefiningOp());
Value entry_node = baseSsa.GetCurrentDef();
-
pluginAPI.AddBlockToLoop(pluginAPI.FindBasicBlock(epilogue_loop_latch), outer->idAttr().getInt());
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(epilogue_loop_latch), pluginAPI.FindBasicBlock(dominator_bb));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(epilogue_loop_latch),
+ pluginAPI.FindBasicBlock(dominator_bb));
SSAOp entrySsa = dyn_cast<mlir::Plugin::SSAOp>(entry_node.getDefiningOp());
res = entrySsa.Copy();
@@ -1439,7 +1411,8 @@ create_epilogue_loop_latch(Block *epilogue_loop_latch,
llvm::SmallVector<mlir::Value> ops;
ops.push_back(res);
ops.push_back(entry_node);
- ops.push_back(ConstOp::CreateConst(*opBuilder, opBuilder->getI64IntegerAttr(originLoop.step), entry_node.getType()));
+ ops.push_back(ConstOp::CreateConst(*opBuilder,
+ opBuilder->getI64IntegerAttr(originLoop.step), entry_node.getType()));
opBuilder->create<AssignOp>(opBuilder->getUnknownLoc(), ops, IExprCode::Plus, (epilogue_loop_latch));
opBuilder->create<FallThroughOp>(opBuilder->getUnknownLoc(), pluginAPI.FindBasicBlock(epilogue_loop_latch), ftBB);
@@ -1447,8 +1420,7 @@ create_epilogue_loop_latch(Block *epilogue_loop_latch,
defs_map.emplace(epilogue_loop_latch, res);
}
-static void
-create_new_loops(edge entryEdge, FunctionOp *funcOp)
+static void create_new_loops(edge entryEdge, FunctionOp *funcOp)
{
Block* prolog_bb;
Block* align_loop_header, *align_loop_latch, *align_loop_body_bb;
@@ -1461,78 +1433,97 @@ create_new_loops(edge entryEdge, FunctionOp *funcOp)
ControlFlowAPI cfAPI;
LoopOp outer = pluginAPI.GetBlockLoopFather(pluginAPI.FindBasicBlock(entryEdge.src));
- uint64_t bbAddr = cfAPI.CreateBlock(entryEdge.src, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(entryEdge.src));
+ uint64_t bbAddr = cfAPI.CreateBlock(entryEdge.src, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(entryEdge.src));
prolog_bb = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(prolog_bb, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(prolog_bb));
- // pluginAPI.InsertCreatedBlock(bbAddr, prolog_bb);
+ bbAddr = cfAPI.CreateBlock(prolog_bb, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(prolog_bb));
align_pred_bb = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(align_pred_bb, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(align_pred_bb));
+ bbAddr = cfAPI.CreateBlock(align_pred_bb, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(align_pred_bb));
align_loop_header = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(align_loop_header, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(align_loop_header));
+ bbAddr = cfAPI.CreateBlock(align_loop_header, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(align_loop_header));
align_loop_body_bb = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(align_loop_body_bb, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(align_loop_body_bb));
+ bbAddr = cfAPI.CreateBlock(align_loop_body_bb, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(align_loop_body_bb));
align_loop_latch = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(align_loop_body_bb, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(align_loop_body_bb));
+ bbAddr = cfAPI.CreateBlock(align_loop_body_bb, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(align_loop_body_bb));
align_loop_exit_bb = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(align_loop_header, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(align_loop_header));
+ bbAddr = cfAPI.CreateBlock(align_loop_header, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(align_loop_header));
epilogue_loop_pred_bb = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(epilogue_loop_pred_bb, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(epilogue_loop_pred_bb));
+ bbAddr = cfAPI.CreateBlock(epilogue_loop_pred_bb, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(epilogue_loop_pred_bb));
epilogue_loop_header = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(epilogue_loop_header, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(epilogue_loop_header));
+ bbAddr = cfAPI.CreateBlock(epilogue_loop_header, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(epilogue_loop_header));
epilogue_loop_body_bb = pluginAPI.FindBlock(bbAddr);
- bbAddr = cfAPI.CreateBlock(epilogue_loop_body_bb, funcOp->idAttr().getInt(), pluginAPI.FindBasicBlock(epilogue_loop_body_bb));
+ bbAddr = cfAPI.CreateBlock(epilogue_loop_body_bb, funcOp->idAttr().getInt(),
+ pluginAPI.FindBasicBlock(epilogue_loop_body_bb));
epilogue_loop_latch = pluginAPI.FindBlock(bbAddr);
create_prolog_bb(prolog_bb, entryEdge.src, entryEdge.src, &outer, entryEdge, funcOp, align_pred_bb);
create_loop_pred_bb(align_pred_bb, prolog_bb, prolog_bb, &outer, funcOp, align_loop_header);
- create_align_loop_header(align_loop_header, align_pred_bb, align_pred_bb, &outer, funcOp, align_loop_body_bb, epilogue_loop_pred_bb);
+ create_align_loop_header(align_loop_header, align_pred_bb, align_pred_bb, &outer,
+ funcOp, align_loop_body_bb, epilogue_loop_pred_bb);
- create_align_loop_body_bb(align_loop_body_bb, align_loop_header, align_loop_header, &outer, funcOp, align_loop_exit_bb, align_loop_latch);
+ create_align_loop_body_bb(align_loop_body_bb, align_loop_header, align_loop_header, &outer,
+ funcOp, align_loop_exit_bb, align_loop_latch);
- create_align_loop_latch(align_loop_latch, align_loop_body_bb, align_loop_body_bb, &outer, funcOp, align_loop_header);
+ create_align_loop_latch(align_loop_latch, align_loop_body_bb, align_loop_body_bb, &outer,
+ funcOp, align_loop_header);
rewrite_add_phi_arg(align_loop_header);
align_loop = init_new_loop(&outer, align_loop_header, align_loop_latch, funcOp);
- create_align_loop_exit_bb(align_loop_exit_bb, align_loop_body_bb, align_loop_body_bb, &outer, funcOp, originLoop.exitBB1);
+ create_align_loop_exit_bb(align_loop_exit_bb, align_loop_body_bb, align_loop_body_bb, &outer,
+ funcOp, originLoop.exitBB1);
- create_loop_pred_bb(epilogue_loop_pred_bb, align_loop_header, align_loop_header, &outer, funcOp, epilogue_loop_header);
+ create_loop_pred_bb(epilogue_loop_pred_bb, align_loop_header, align_loop_header, &outer,
+ funcOp, epilogue_loop_header);
- create_epilogue_loop_header(epilogue_loop_header, epilogue_loop_pred_bb, epilogue_loop_pred_bb, &outer, funcOp, epilogue_loop_body_bb, originLoop.exitBB1);
+ create_epilogue_loop_header(epilogue_loop_header, epilogue_loop_pred_bb, epilogue_loop_pred_bb, &outer,
+ funcOp, epilogue_loop_body_bb, originLoop.exitBB1);
- create_epilogue_loop_body_bb(epilogue_loop_body_bb, epilogue_loop_header, epilogue_loop_header, &outer, funcOp, originLoop.exitBB1 , epilogue_loop_latch);
+ create_epilogue_loop_body_bb(epilogue_loop_body_bb, epilogue_loop_header, epilogue_loop_header, &outer,
+ funcOp, originLoop.exitBB1, epilogue_loop_latch);
- create_epilogue_loop_latch(epilogue_loop_latch, epilogue_loop_body_bb, epilogue_loop_body_bb, &outer, funcOp, epilogue_loop_header);
+ create_epilogue_loop_latch(epilogue_loop_latch, epilogue_loop_body_bb, epilogue_loop_body_bb, &outer,
+ funcOp, epilogue_loop_header);
rewrite_add_phi_arg(epilogue_loop_header);
epilogue_loop = init_new_loop(&outer, epilogue_loop_header, epilogue_loop_latch, funcOp);
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(originLoop.exitBB1), pluginAPI.FindBasicBlock(entryEdge.src));
- cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(originLoop.exitBB2), pluginAPI.FindBasicBlock(entryEdge.src));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(originLoop.exitBB1),
+ pluginAPI.FindBasicBlock(entryEdge.src));
+ cfAPI.SetImmediateDominator(1, pluginAPI.FindBasicBlock(originLoop.exitBB2),
+ pluginAPI.FindBasicBlock(entryEdge.src));
rewrite_add_phi_arg(originLoop.exitBB1);
rewrite_add_phi_arg(originLoop.exitBB2);
- cfAPI.RemoveEdge(pluginAPI.FindBasicBlock(originLoop.exitE1.src), pluginAPI.FindBasicBlock(originLoop.exitE1.dest));
- cfAPI.RemoveEdge(pluginAPI.FindBasicBlock(originLoop.exitE2.src), pluginAPI.FindBasicBlock(originLoop.exitE2.dest));
+ cfAPI.RemoveEdge(pluginAPI.FindBasicBlock(originLoop.exitE1.src),
+ pluginAPI.FindBasicBlock(originLoop.exitE1.dest));
+ cfAPI.RemoveEdge(pluginAPI.FindBasicBlock(originLoop.exitE2.src),
+ pluginAPI.FindBasicBlock(originLoop.exitE2.dest));
}
-
-static void
-convertToNewLoop(LoopOp* loop, FunctionOp* funcOp)
+static void convertToNewLoop(LoopOp* loop, FunctionOp* funcOp)
{
ControlFlowAPI cfAPI;
create_new_loops(originLoop.entryEdge, funcOp);
@@ -1542,9 +1533,7 @@ convertToNewLoop(LoopOp* loop, FunctionOp* funcOp)
return;
}
-
-static void
-ProcessArrayWiden(void)
+static void ProcessArrayWiden(void)
{
std::cout << "Running first pass, awiden\n";
@@ -1567,13 +1556,33 @@ ProcessArrayWiden(void)
}
}
+class ArrayWidenPass : public PluginOptBase {
+public:
+ ArrayWidenPass() : PluginOptBase(HANDLE_MANAGER_SETUP)
+ {
+ }
+ bool Gate()
+ {
+ return true;
+ }
+ int DoOptimize()
+ {
+ uint64_t *fun = (uint64_t *)GetFuncAddr();
+ return DoOptimize(fun);
+ }
+ int DoOptimize(uint64_t *fun);
+};
+
+int ArrayWidenPass::DoOptimize(uint64_t *fun)
+{
+ ProcessArrayWiden();
+ return 0;
+}
+}
+
void RegisterCallbacks(void)
{
- PluginServer::GetInstance()->RegisterUserFunc(HANDLE_BEFORE_IPA, UserOptimizeFunc);
- PluginServer::GetInstance()->RegisterUserFunc(HANDLE_BEFORE_IPA, LocalVarSummery);
- // ManagerSetupData setupData;
- // setupData.refPassName = PASS_PHIOPT;
- // setupData.passNum = 1;
- // setupData.passPosition = PASS_INSERT_AFTER;
- // PluginServer::GetInstance()->RegisterPassManagerSetup(HANDLE_MANAGER_SETUP, setupData, ProcessArrayWiden);
+ PinServer::PluginServer *pluginServer = PinServer::PluginServer::GetInstance();
+ PluginOpt::ManagerSetup setupData(PluginOpt::PASS_PHIOPT, 1, PluginOpt::PASS_INSERT_AFTER);
+ pluginServer->RegisterPassManagerOpt(setupData, std::make_shared<PluginOpt::ArrayWidenPass>());
}
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/pin-server.git
git@gitee.com:src-openeuler/pin-server.git
src-openeuler
pin-server
pin-server
master

搜索帮助