[llvm-commits] [llvm] r44643 - /llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp
Evan Cheng
evan.cheng at apple.com
Thu Dec 6 17:44:15 PST 2007
On Dec 5, 2007, at 4:08 PM, Chris Lattner wrote:
> 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 :)
It's experimental. I'll reduce some a test case when it's enabled. :-)
Evan
>
>
> -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
>
> _______________________________________________
> 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