Skip to content
This repository has been archived by the owner on Jan 19, 2025. It is now read-only.

Ivanov Nikita. Lab 2. Var 3. #61

Merged
merged 24 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions llvm/labs/lab2/ivanov_nikita/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

set(PluginName AtikinLoopPass)
add_compile_definitions(NAME=${PluginName})

string(TOUPPER ${PluginName} PluginNameUpper)
set(LLVM_${PluginNameUpper}_LINK_INTO_TOOLS ON)

file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h)
add_llvm_pass_plugin(${PluginName}
${ALL_SOURCE_FILES}
DEPENDS
intrinsics_gen
BUILDTREE_ONLY)

target_link_libraries(${PluginName}
PUBLIC
LLVMSupport
LLVMCore
LLVMipo
LLVMPasses)

set(LLVM_TEST_DEPENDS ${PluginName} ${LLVM_TEST_DEPENDS} PARENT_SCOPE)
66 changes: 66 additions & 0 deletions llvm/labs/lab2/ivanov_nikita/ivanov.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Pass.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"

using namespace llvm;

class MyLoopPass : public PassInfoMixin<MyLoopPass> {
public:
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
auto *Ty = FunctionType::get(llvm::Type::getVoidTy(F.getContext()),
false); // get func type
auto *M = F.getParent();

auto LoopStartFunc =
M->getOrInsertFunction("loop_start", Ty); // create func start
auto LoopEndFunc =
M->getOrInsertFunction("loop_end", Ty); // create func end

auto &LI = FAM.getResult<LoopAnalysis>(F);

for (auto &L : LI) { // for by loop
auto *Preheader =
L->getLoopPreheader(); // get preheader block of the loop
auto *ExitBlock = L->getExitBlock(); // end exit block of the loop
IRBuilder<> Builder(Preheader->getTerminator()); // api for basic block

if (!Preheader)
continue;

Builder.CreateCall(LoopStartFunc); // paste loop_start

if (!ExitBlock)
continue;

Builder.SetInsertPoint(
ExitBlock->getFirstNonPHI()); // set pointer to exit block
Builder.CreateCall(LoopEndFunc); // paste loop_start
}
return PreservedAnalyses::all();
}
};

/* New PM Registration */
llvm::PassPluginLibraryInfo getAtikinLoopPassPluginInfo() {
return {LLVM_PLUGIN_API_VERSION, "AtikinLoopPass", LLVM_VERSION_STRING,
[](llvm::PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](llvm::StringRef Name, llvm::FunctionPassManager &PM,
llvm::ArrayRef<llvm::PassBuilder::PipelineElement>) {
if (Name == "ivanov-loop-pass") {
PM.addPass(MyLoopPass());
return true;
}
return false;
});
}};
}

extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
return getAtikinLoopPassPluginInfo();
}
44 changes: 44 additions & 0 deletions llvm/test/lab2/ivanov_nikita/test.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
; RUN: opt -passes=ivanov-loop-pass -S %s 2>&1 | FileCheck %s

; void foo(int n, int m) {
; int c0;
; int c1;
; for (c0 = n; c0 > 0; c0--) {
; c1++;
; }
; }

define dso_local void @_Z3fooii(i32 noundef %n, i32 noundef %m) {
entry:
%n.addr = alloca i32, align 4
%m.addr = alloca i32, align 4
%c0 = alloca i32, align 4
%c1 = alloca i32, align 4
store i32 %n, ptr %n.addr, align 4
store i32 %m, ptr %m.addr, align 4
%0 = load i32, ptr %n.addr, align 4
store i32 %0, ptr %c0, align 4
; CHECK: call void @loop_start()
br label %for.cond

for.cond:
%1 = load i32, ptr %c0, align 4
%cmp = icmp sgt i32 %1, 0
br i1 %cmp, label %for.body, label %for.end

for.body:
%2 = load i32, ptr %c1, align 4
%inc = add nsw i32 %2, 1
store i32 %inc, ptr %c1, align 4
br label %for.inc

for.inc:
%3 = load i32, ptr %c0, align 4
%dec = add nsw i32 %3, -1
store i32 %dec, ptr %c0, align 4
br label %for.cond

for.end:
; CHECK: call void @loop_end()
ret void
}
Loading