Files
Colton1skees 43a850091c Push vmp devirt
Co-authored-by: name <37@cmail.nu>
2025-03-29 19:08:17 -04:00

106 lines
3.1 KiB
C++

#pragma once
#include "API/ExportDef.h"
#include "Pipeline/Pipeline.h"
namespace Dna::API {
DNA_EXPORT void OptimizeLLVMModule(llvm::Module* module,
llvm::Function* f,
bool aggressiveUnroll,
bool runClassifyingAliasAnalysis,
Dna::Passes::tGetAliasResult getAliasResult,
bool runConstantConcretization,
Dna::Passes::tReadBinaryContents readBinaryContents,
bool runStructuring,
bool justGVN,
Dna::Passes::tStructureFunction structureFunction)
{
Dna::Pipeline::OptimizeModule(module, f, aggressiveUnroll, runClassifyingAliasAnalysis, getAliasResult, runConstantConcretization, readBinaryContents, runStructuring, justGVN, structureFunction);
}
DNA_EXPORT void PrepareForCloning(llvm::Function* function, bool jumpThreading)
{
llvm::PassRegistry& Registry = *llvm::PassRegistry::getPassRegistry();
llvm::initializeCore(Registry);
llvm::initializeScalarOpts(Registry);
llvm::initializeIPO(Registry);
llvm::initializeAnalysis(Registry);
llvm::initializeTransformUtils(Registry);
llvm::initializeInstCombine(Registry);
llvm::initializeTargetLibraryInfoWrapperPassPass(Registry);
llvm::initializeGlobalsAAWrapperPassPass(Registry);
llvm::initializeGVNLegacyPassPass(Registry);
llvm::initializeDependenceAnalysisWrapperPassPass(Registry);
//llvm::initializeIPSCCPLegacyPassPass(Registry);
initializeTarget(Registry);
// Create pass managers.
llvm::FunctionPassManager FPM;
//llvm::PassManagerBuilder PMB;
llvm::legacy::PassManager module_manager;
llvm::LoopAnalysisManager LAM;
llvm::FunctionAnalysisManager FAM;
llvm::CGSCCAnalysisManager CGAM;
llvm::ModulePassManager MPM;
llvm::ModuleAnalysisManager MAM;
llvm::LoopPassManager LPM;
llvm::PassBuilder PB;
// Demote ssa variables to stack vars
FPM.addPass(llvm::RegToMemPass());
// Apply jump threading to undo some of the critical edge splittingf
if(jumpThreading)
FPM.addPass(llvm::JumpThreadingPass(99999));
FAM.registerPass([&] { return PB.buildDefaultAAPipeline(); });
PB.registerModuleAnalyses(MAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerFunctionAnalyses(FAM);
PB.registerLoopAnalyses(LAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
// Invoke the passes
FPM.run(*function, FAM);
}
DNA_EXPORT llvm::BasicBlock* CloneBasicBlock(llvm::BasicBlock* block)
{
llvm::ValueToValueMapTy VMap;
auto clone = llvm::CloneBasicBlock(block, VMap, ".clone", block->getParent());
/*
for (auto& inst : *clone)
{
for (int i = 0; i < inst.getNumOperands(); i++)
{
if (VMap.find(inst.getOperand(i)) == VMap.end())
{
continue;
}
inst.setOperand(i, VMap[inst.getOperand(i)]);
}
}
*/
llvm::ValueToValueMapTy invMap;
for (auto key : VMap)
{
llvm::outs() << "mapping: " << *key->first << " to: " << *key->second << "\n";
//llvm::outs() << "mapping instruction from " << key->first->
//invMap[key.second] = invMap[key.first];
}
printf("no remap");
llvm::remapInstructionsInBlocks({clone}, VMap);
return clone;
}
DNA_EXPORT bool MergeBlockIntoPredecessor(llvm::BasicBlock* block)
{
return llvm::MergeBlockIntoPredecessor(block);
}
}