mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
2835bf79f7
abomination. For starters, this API is incredibly slow. In order to lookup the name of a pass it must take a memory fence to acquire a pointer to the managed static pass registry, and then potentially acquire locks while it consults this registry for information about what passes exist by that name. This stops the world of LLVMs in your process no matter how little they cared about the result. To make this more joyful, you'll note that we are preserving many passes which *do not exist* any more, or are not even analyses which one might wish to have be preserved. This means we do all the work only to say "nope" with no error to the user. String-based APIs are a *bad idea*. String-based APIs that cannot produce any meaningful error are an even worse idea. =/ I have a patch that simply removes this API completely, but I'm hesitant to commit it as I don't really want to perniciously break out-of-tree users of the old pass manager. I'd rather they just have to migrate to the new one at some point. If others disagree and would like me to kill it with fire, just say the word. =] llvm-svn: 227294
91 lines
2.7 KiB
C++
91 lines
2.7 KiB
C++
//===- HexagonRemoveExtendArgs.cpp - Remove unnecessary argument sign extends //
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Pass that removes sign extends for function parameters. These parameters
|
|
// are already sign extended by the caller per Hexagon's ABI
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Hexagon.h"
|
|
#include "HexagonTargetMachine.h"
|
|
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
|
|
#include "llvm/CodeGen/StackProtector.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Transforms/Scalar.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
void initializeHexagonRemoveExtendArgsPass(PassRegistry&);
|
|
}
|
|
|
|
namespace {
|
|
struct HexagonRemoveExtendArgs : public FunctionPass {
|
|
public:
|
|
static char ID;
|
|
HexagonRemoveExtendArgs() : FunctionPass(ID) {
|
|
initializeHexagonRemoveExtendArgsPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
bool runOnFunction(Function &F) override;
|
|
|
|
const char *getPassName() const override {
|
|
return "Remove sign extends";
|
|
}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.addRequired<MachineFunctionAnalysis>();
|
|
AU.addPreserved<MachineFunctionAnalysis>();
|
|
AU.addPreserved<StackProtector>();
|
|
FunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
};
|
|
}
|
|
|
|
char HexagonRemoveExtendArgs::ID = 0;
|
|
|
|
INITIALIZE_PASS(HexagonRemoveExtendArgs, "reargs",
|
|
"Remove Sign and Zero Extends for Args", false, false)
|
|
|
|
bool HexagonRemoveExtendArgs::runOnFunction(Function &F) {
|
|
unsigned Idx = 1;
|
|
for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end(); AI != AE;
|
|
++AI, ++Idx) {
|
|
if (F.getAttributes().hasAttribute(Idx, Attribute::SExt)) {
|
|
Argument* Arg = AI;
|
|
if (!isa<PointerType>(Arg->getType())) {
|
|
for (auto UI = Arg->user_begin(); UI != Arg->user_end();) {
|
|
if (isa<SExtInst>(*UI)) {
|
|
Instruction* I = cast<Instruction>(*UI);
|
|
SExtInst* SI = new SExtInst(Arg, I->getType());
|
|
assert (EVT::getEVT(SI->getType()) ==
|
|
(EVT::getEVT(I->getType())));
|
|
++UI;
|
|
I->replaceAllUsesWith(SI);
|
|
Instruction* First = F.getEntryBlock().begin();
|
|
SI->insertBefore(First);
|
|
I->eraseFromParent();
|
|
} else {
|
|
++UI;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
FunctionPass*
|
|
llvm::createHexagonRemoveExtendArgs(const HexagonTargetMachine &TM) {
|
|
return new HexagonRemoveExtendArgs();
|
|
}
|