LLVM Loop pass - 新的通行证管理器

问题描述 投票:0回答:0

我正在尝试在 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。我已经完成了正确的步骤,在最后的步骤中需要一点帮助。

clang llvm compiler-optimization
© www.soinside.com 2019 - 2024. All rights reserved.