On Dec 5, 2007, at 3:58 PM, Evan Cheng wrote: > URL: http://llvm.org/viewvc/llvm-project?rev=44643&view=rev > Log: > If both result of the {s|z}xt and its source are live out, rewrite > all uses of the source with result of extension.
I assume this is experimental, right? What sort of case does it fix? Testcase please :) -Chris > Modified: > llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp > > Modified: llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/ > Scalar/CodeGenPrepare.cpp?rev=44643&r1=44642&r2=44643&view=diff > > ====================================================================== > ======== > --- llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp (original) > +++ llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp Wed Dec 5 > 17:58:20 2007 > @@ -28,11 +28,17 @@ > #include "llvm/Transforms/Utils/Local.h" > #include "llvm/ADT/DenseMap.h" > #include "llvm/ADT/SmallSet.h" > -#include "llvm/Support/Debug.h" > +#include "llvm/Support/CommandLine.h" > #include "llvm/Support/Compiler.h" > +#include "llvm/Support/Debug.h" > #include "llvm/Support/GetElementPtrTypeIterator.h" > using namespace llvm; > > +namespace { > + cl::opt<bool> OptExtUses("optimize-ext-uses", > + cl::init(false), cl::Hidden); > +} > + > namespace { > class VISIBILITY_HIDDEN CodeGenPrepare : public FunctionPass { > /// TLI - Keep a pointer of a TargetLowering to consult for > determining > @@ -52,6 +58,7 @@ > bool OptimizeLoadStoreInst(Instruction *I, Value *Addr, > const Type *AccessTy, > DenseMap<Value*,Value*> &SunkAddrs); > + bool OptimizeExtUses(Instruction *I); > }; > } > > @@ -913,6 +920,61 @@ > return true; > } > > +bool CodeGenPrepare::OptimizeExtUses(Instruction *I) { > + BasicBlock *DefBB = I->getParent(); > + > + // If both result of the {s|z}xt and its source are live out, > rewrite all > + // other uses of the source with result of extension. > + Value *Src = I->getOperand(0); > + if (Src->hasOneUse()) > + return false; > + > + bool DefIsLiveOut = false; > + for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); > + UI != E; ++UI) { > + Instruction *User = cast<Instruction>(*UI); > + > + // Figure out which BB this ext is used in. > + BasicBlock *UserBB = User->getParent(); > + if (UserBB == DefBB) continue; > + DefIsLiveOut = true; > + break; > + } > + if (!DefIsLiveOut) > + return false; > + > + // InsertedTruncs - Only insert one trunc in each block once. > + DenseMap<BasicBlock*, Instruction*> InsertedTruncs; > + > + bool MadeChange = false; > + for (Value::use_iterator UI = Src->use_begin(), E = Src->use_end(); > + UI != E; ++UI) { > + Use &TheUse = UI.getUse(); > + Instruction *User = cast<Instruction>(*UI); > + > + // Figure out which BB this ext is used in. > + BasicBlock *UserBB = User->getParent(); > + if (UserBB == DefBB) continue; > + > + // Both src and def are live in this block. Rewrite the use. > + Instruction *&InsertedTrunc = InsertedTruncs[UserBB]; > + > + if (!InsertedTrunc) { > + BasicBlock::iterator InsertPt = UserBB->begin(); > + while (isa<PHINode>(InsertPt)) ++InsertPt; > + > + InsertedTrunc = new TruncInst(I, Src->getType(), "", InsertPt); > + } > + > + // Replace a use of the {s|z}ext source with a use of the result. > + TheUse = InsertedTrunc; > + > + MadeChange = true; > + } > + > + return MadeChange; > +} > + > // In this pass we look for GEP and cast instructions that are used > // across basic blocks and rewrite them to improve basic-block-at- > a-time > // selection. > @@ -948,8 +1010,14 @@ > if (isa<Constant>(CI->getOperand(0))) > continue; > > - if (TLI) > - MadeChange |= OptimizeNoopCopyExpression(CI, *TLI); > + bool Change = false; > + if (TLI) { > + Change = OptimizeNoopCopyExpression(CI, *TLI); > + MadeChange |= Change; > + } > + > + if (OptExtUses && !Change && (isa<ZExtInst>(I) || > isa<SExtInst>(I))) > + MadeChange |= OptimizeExtUses(I); > } else if (CmpInst *CI = dyn_cast<CmpInst>(I)) { > MadeChange |= OptimizeCmpExpression(CI); > } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) { > > > _______________________________________________ > llvm-commits mailing list > llvm-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits