代码拉取完成,页面将自动刷新
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 ®ion = 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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。