我正在尝试在 llvm 中创建一个循环传递——使用新的传递管理器。
我在 /llvm/include/llvm/Transforms/Utils/MyLoopPass.h 中放置了一个头文件
头文件内容如下:
#ifndef LLVM_TRANSFORMS_UTILS_MYLOOPPASS_H
#define LLVM_TRANSFORMS_UTILS_MYLOOPPASS_H
#include "llvm/IR/PassManager.h"
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Passes/PassBuilder.h"
namespace llvm {
class MyLoopPass : public LoopPass {
public:
static char ID;
MyLoopPass() : LoopPass(ID) {}
bool runOnLoop(Loop *L, LPPassManager &LPM) override;
static StringRef name() { return "MyLoopPass"; } // add this line
};
} // namespace llvm
#endif
此外,我将 MyLoopPass.cpp 的 cpp 文件放在 llvm/lib/Transforms/Utils/MyLoopPass.cpp 中
cpp文件内容如下:
#include "llvm/Transforms/Utils/MyLoopPass.h"
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/IR/Constants.h"
#include "llvm/Passes/PassBuilder.h"
using namespace llvm;
class MyLoopPass : public LoopPass {
public:
static char ID;
MyLoopPass() : LoopPass(ID) {}
MyLoopPass(const MyLoopPass &Other) : LoopPass(Other) {}
//MyLoopPass(MyLoopPass &&Other) : LoopPass(std::move(Other)) {}
//virtual llvm::StringRef getP() const { return "my-loop-pass"; }
static StringRef name() { return "MyLoopPass"; }
bool runOnLoop(Loop* L, LPPassManager& LPM) override {
BasicBlock* LoopPreheader = L->getLoopPreheader();
BasicBlock* LoopHeader = L->getHeader();
PHINode* IndVar = L->getCanonicalInductionVariable();
// Get the current step value of the induction variable
Value* StepValue = IndVar->getIncomingValueForBlock(LoopPreheader);
// Create a new step value that increments the induction variable by two
Value* NewStepValue = BinaryOperator::CreateAdd(StepValue, ConstantInt::get(StepValue->getType(), 2), "new.step", LoopPreheader->getTerminator());
// Update the step value of the induction variable
IndVar->setIncomingValueForBlock(LoopPreheader, NewStepValue);
return true;
}
};
char MyLoopPass::ID = 0;
// Register the pass with LLVM
要注册通行证,我在
#include "llvm/Transforms/Utils/MyLoopPass.h"
中放置了passbuilder.cpp
,在LOOP_PASS("my-loop-pass",MyLoopPass())
中添加了
Passregistry.def
出于某种原因,我不断收到此错误: 错误:调用“llvm::LoopPass”的隐式删除的复制构造函数 MyLoopPass(const MyLoopPass &Other) : LoopPass(Other) {} ^ ~~~~~ /Users/eshafatima/Desktop/llvm-project/llvm/include/llvm/Analysis/LoopPass.h:28:18: 注意:“LoopPass”的复制构造函数被隐式删除,因为基类“llvm::Pass”已删除复制构造函数 LoopPass 类:公共通行证 {
我想构建这个 LoopPass,它基本上只是将归纳变量递增 2 而不是 1。我已经完成了正确的步骤,在最后的步骤中需要一点帮助。