[llvm-commits] [llvm] r44643 - /llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp

Chris Lattner clattner at apple.com
Wed Dec 5 16:08:10 PST 2007


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 at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list