X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=lib%2FTransforms%2FLevelRaise.cpp;h=a1ca7eb22daa01ba986b0246a1f0d4f3f1f7b228;hb=3a15d707340eef80e01651a4529965ca1a3f3b2f;hp=7e27c5f7f0b9b44fbd4f6744407003d0d45d1ea1;hpb=b1b4262387b0060af9c01297d146bb17ed361a84;p=oota-llvm.git diff --git a/lib/Transforms/LevelRaise.cpp b/lib/Transforms/LevelRaise.cpp index 7e27c5f7f0b..a1ca7eb22da 100644 --- a/lib/Transforms/LevelRaise.cpp +++ b/lib/Transforms/LevelRaise.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Transforms/LevelChange.h" +#include "llvm/Transforms/RaisePointerReferences.h" #include "llvm/Transforms/Utils/Local.h" #include "TransformInternals.h" #include "llvm/iOther.h" @@ -26,17 +26,24 @@ using std::cerr; // raising pass to start at instruction "foo", which is immensely useful for // debugging! // -static cl::String StartInst("raise-start-inst", "Start raise pass at the " - "instruction with the specified name", cl::Hidden); +static cl::opt +StartInst("raise-start-inst", cl::Hidden, cl::value_desc("inst name"), + cl::desc("Start raise pass at the instruction with the specified name")); -static Statistic<> NumLoadStorePeepholes("raise\t\t- Number of load/store " - "peepholes"); -static Statistic<> NumGEPInstFormed("raise\t\t- Number of other " - "getelementptr's formed"); -static Statistic<> NumExprTreesConv("raise\t\t- Number of expression trees" - " converted"); -static Statistic<> NumCastOfCast("raise\t\t- Number of cast-of-self removed"); -static Statistic<> NumDCEorCP("raise\t\t- Number of insts DCEd or constprop'd"); +static Statistic<> +NumLoadStorePeepholes("raise\t\t- Number of load/store peepholes"); + +static Statistic<> +NumGEPInstFormed("raise\t\t- Number of other getelementptr's formed"); + +static Statistic<> +NumExprTreesConv("raise\t\t- Number of expression trees converted"); + +static Statistic<> +NumCastOfCast("raise\t\t- Number of cast-of-self removed"); + +static Statistic<> +NumDCEorCP("raise\t\t- Number of insts DCEd or constprop'd"); #define PRINT_PEEPHOLE(ID, NUM, I) \ @@ -158,7 +165,7 @@ static bool PeepholeOptimizeAddCast(BasicBlock *BB, BasicBlock::iterator &BI, } // Only proceed if we have detected all of our conditions successfully... - if (!CompTy || !SrcPtr || !OffsetVal->getType()->isIntegral()) + if (!CompTy || !SrcPtr || !OffsetVal->getType()->isInteger()) return false; std::vector Indices; @@ -172,8 +179,7 @@ static bool PeepholeOptimizeAddCast(BasicBlock *BB, BasicBlock::iterator &BI, } GetElementPtrInst *GEP = new GetElementPtrInst(SrcPtr, Indices, - AddOp2->getName()); - BI = ++BB->getInstList().insert(BI, GEP); + AddOp2->getName(), BI); Instruction *NCI = new CastInst(GEP, AddOp1->getType()); ReplaceInstWithInst(BB->getInstList(), BI, NCI); @@ -317,7 +323,7 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { // Build the index vector, full of all zeros std::vector Indices; - Indices.push_back(ConstantUInt::get(Type::UIntTy, 0)); + Indices.push_back(ConstantSInt::get(Type::LongTy, 0)); while (CurCTy && !isa(CurCTy)) { if (const StructType *CurSTy = dyn_cast(CurCTy)) { // Check for a zero element struct type... if we have one, bail. @@ -332,7 +338,7 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { } // Insert a zero to index through this type... - Indices.push_back(ConstantUInt::get(CurCTy->getIndexType(), 0)); + Indices.push_back(Constant::getNullValue(CurCTy->getIndexType())); // Did we find what we're looking for? if (ElTy->isLosslesslyConvertableTo(DestPointedTy)) break; @@ -347,11 +353,11 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { if (ElTy) { PRINT_PEEPHOLE1("cast-for-first:in", CI); + std::string Name = CI->getName(); CI->setName(""); + // Insert the new T cast instruction... stealing old T's name GetElementPtrInst *GEP = new GetElementPtrInst(Src, Indices, - CI->getName()); - CI->setName(""); - BI = ++BB->getInstList().insert(BI, GEP); + Name, BI); // Make the old cast instruction reference the new GEP instead of // the old src value. @@ -386,15 +392,13 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { if (Value *CastSrc = CI->getOperand(0)) // CSPT = CastSrcPointerType if (const PointerType *CSPT = dyn_cast(CastSrc->getType())) // convertable types? - if (Val->getType()->isLosslesslyConvertableTo(CSPT->getElementType()) && - !SI->hasIndices()) { // No subscripts yet! + if (Val->getType()->isLosslesslyConvertableTo(CSPT->getElementType())) { PRINT_PEEPHOLE3("st-src-cast:in ", Pointer, Val, SI); // Insert the new T cast instruction... stealing old T's name + std::string Name(CI->getName()); CI->setName(""); CastInst *NCI = new CastInst(Val, CSPT->getElementType(), - CI->getName()); - CI->setName(""); - BI = ++BB->getInstList().insert(BI, NCI); + Name, BI); // Replace the old store with a new one! ReplaceInstWithInst(BB->getInstList(), BI, @@ -426,16 +430,14 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { if (Value *CastSrc = CI->getOperand(0)) // CSPT = CastSrcPointerType if (const PointerType *CSPT = dyn_cast(CastSrc->getType())) // convertable types? - if (PtrElType->isLosslesslyConvertableTo(CSPT->getElementType()) && - !LI->hasIndices()) { // No subscripts yet! + if (PtrElType->isLosslesslyConvertableTo(CSPT->getElementType())) { PRINT_PEEPHOLE2("load-src-cast:in ", Pointer, LI); // Create the new load instruction... loading the pre-casted value - LoadInst *NewLI = new LoadInst(CastSrc, LI->getName()); + LoadInst *NewLI = new LoadInst(CastSrc, LI->getName(), BI); // Insert the new T cast instruction... stealing old T's name CastInst *NCI = new CastInst(NewLI, LI->getType(), CI->getName()); - BI = ++BB->getInstList().insert(BI, NewLI); // Replace the old store with a new one! ReplaceInstWithInst(BB->getInstList(), BI, NCI); @@ -468,7 +470,7 @@ static bool DoRaisePass(Function &F) { if (dceInstruction(BI) || doConstantPropogation(BI)) { Changed = true; ++NumDCEorCP; - DEBUG(cerr << "***\t\t^^-- DeadCode Elinated!\n"); + DEBUG(cerr << "***\t\t^^-- Dead code eliminated!\n"); } else if (PeepholeOptimize(BB, BI)) { Changed = true; } else { @@ -522,7 +524,9 @@ static bool doRPR(Function &F) { namespace { struct RaisePointerReferences : public FunctionPass { - const char *getPassName() const { return "Raise Pointer References"; } + + // FIXME: constructor should save and use target data here!! + RaisePointerReferences(const TargetData &TD) {} virtual bool runOnFunction(Function &F) { return doRPR(F); } @@ -532,8 +536,9 @@ namespace { }; } -Pass *createRaisePointerReferencesPass() { - return new RaisePointerReferences(); +Pass *createRaisePointerReferencesPass(const TargetData &TD) { + return new RaisePointerReferences(TD); } - +static RegisterOpt +X("raise", "Raise Pointer References", createRaisePointerReferencesPass);