Files
revng-revng/lib/RemoveCpuLoopStore/RemoveCpuLoopStorePass.cpp
T
2020-11-12 18:00:45 +01:00

51 lines
1.4 KiB
C++

//
// Copyright rev.ng Srls. See LICENSE.md for details.
//
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "revng/Support/IRHelpers.h"
#include "revng-c/RemoveCpuLoopStore/RemoveCpuLoopStorePass.h"
using namespace llvm;
char RemoveCpuLoopStorePass::ID = 0;
using Reg = RegisterPass<RemoveCpuLoopStorePass>;
static Reg X("remove-cpu-loop-store", "Removes store to cpu_loop", true, true);
bool RemoveCpuLoopStorePass::runOnFunction(Function &F) {
if (not F.hasMetadata("revng.func.entry"))
return false;
// Retrieve the global variable `cpu_loop_exiting`
Module *M = F.getParent();
GlobalVariable *CpuLoop = M->getGlobalVariable("cpu_loop_exiting");
// Remove in bulk all the users of the global variable. We directly cast
// the user to a `llvm::StoreInst` by design (if we have another kind of user
// our assumptions does not hold.
SmallVector<Instruction *, 8> ToErase;
for (User *U : CpuLoop->users()) {
Instruction *I = cast<Instruction>(U);
// Check only translated functions.
if (I->getParent()->getParent() != &F)
continue;
StoreInst *Store = cast<StoreInst>(U);
ToErase.push_back(Store);
}
// Remove in bulk all the store found before.
bool Changed = not ToErase.empty();
for (Instruction *I : ToErase) {
I->eraseFromParent();
}
return Changed;
}