#include "llvm/Transforms/LevelChange.h"
#include "TransformInternals.h"
-#include "llvm/Method.h"
#include "llvm/iOther.h"
#include "llvm/iMemory.h"
-#include "llvm/ConstantVals.h"
#include "llvm/Pass.h"
+#include "llvm/ConstantHandling.h"
#include "llvm/Transforms/Scalar/DCE.h"
-#include "llvm/Transforms/Scalar/ConstantHandling.h"
#include "llvm/Transforms/Scalar/ConstantProp.h"
#include "llvm/Analysis/Expressions.h"
#include "Support/STLExtras.h"
#include <algorithm>
-#include "llvm/Assembly/Writer.h"
-
//#define DEBUG_PEEPHOLE_INSTS 1
#ifdef DEBUG_PEEPHOLE_INSTS
}
-
// Peephole optimize the following instructions:
// %t1 = cast ? to x *
// %t2 = add x * %SP, %t1 ;; Constant must be 2nd operand
return true;
}
- // Peephole optimize the following instructions:
- // %tmp = cast <ty> %V to <ty2>
- // %V = cast <ty2> %tmp to <ty3> ; Where ty & ty2 are same size
- //
- // Into: cast <ty> %V to <ty3>
- //
- if (SrcI)
- if (CastInst *CSrc = dyn_cast<CastInst>(SrcI))
- if (isReinterpretingCast(CI) + isReinterpretingCast(CSrc) < 2) {
- // We can only do c-c elimination if, at most, one cast does a
- // reinterpretation of the input data.
- //
- // If legal, make this cast refer the the original casts argument!
- //
- PRINT_PEEPHOLE2("cast-cast:in ", CI, CSrc);
- CI->setOperand(0, CSrc->getOperand(0));
- PRINT_PEEPHOLE1("cast-cast:out", CI);
- return true;
- }
-
// Check to see if it's a cast of an instruction that does not depend on the
// specific type of the operands to do it's job.
if (!isReinterpretingCast(CI)) {
-static bool DoRaisePass(Method *M) {
+static bool DoRaisePass(Function *F) {
bool Changed = false;
- for (Method::iterator MI = M->begin(), ME = M->end(); MI != ME; ++MI) {
+ for (Function::iterator MI = F->begin(), ME = F->end(); MI != ME; ++MI) {
BasicBlock *BB = *MI;
BasicBlock::InstListType &BIL = BB->getInstList();
}
-// RaisePointerReferences::doit - Raise a method representation to a higher
+// RaisePointerReferences::doit - Raise a function representation to a higher
// level.
//
-static bool doRPR(Method *M) {
+static bool doRPR(Function *F) {
#ifdef DEBUG_PEEPHOLE_INSTS
- cerr << "\n\n\nStarting to work on Method '" << M->getName() << "'\n";
+ cerr << "\n\n\nStarting to work on Function '" << F->getName() << "'\n";
#endif
// Insert casts for all incoming pointer pointer values that are treated as
do {
#ifdef DEBUG_PEEPHOLE_INSTS
- cerr << "Looping: \n" << M;
+ cerr << "Looping: \n" << F;
#endif
- // Iterate over the method, refining it, until it converges on a stable
+ // Iterate over the function, refining it, until it converges on a stable
// state
LocalChange = false;
- while (DoRaisePass(M)) LocalChange = true;
+ while (DoRaisePass(F)) LocalChange = true;
Changed |= LocalChange;
} while (LocalChange);
}
namespace {
- struct RaisePointerReferences : public MethodPass {
- virtual bool runOnMethod(Method *M) { return doRPR(M); }
+ struct RaisePointerReferences : public FunctionPass {
+ const char *getPassName() const { return "Raise Pointer References"; }
+
+ virtual bool runOnFunction(Function *F) { return doRPR(F); }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.preservesCFG();
+ }
};
}