[llvm-commits] [llvm] r94493 - in /llvm/trunk: lib/Transforms/Utils/PromoteMemoryToRegister.cpp test/Transforms/Mem2Reg/ConvertDebugInfo.ll
Victor Hernandez
vhernandez at apple.com
Tue Jan 26 10:58:15 PST 2010
Fixed in r94567.
Victor
On Jan 26, 2010, at 10:42 AM, Devang Patel wrote:
> Hi Victor,
>
> On Tue, Jan 26, 2010 at 2:42 AM, Victor Hernandez <vhernandez at apple.com> wrote:
>> Author: hernande
>> Date: Mon Jan 25 20:42:15 2010
>> New Revision: 94493
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=94493&view=rev
>> Log:
>> In mem2reg, for all alloca/stores that get promoted where the alloca has an associated llvm.dbg.declare instrinsic, insert an llvm.dbg.var intrinsic before each store.
>>
>> Added:
>> llvm/trunk/test/Transforms/Mem2Reg/ConvertDebugInfo.ll
>> - copied unchanged from r94428, llvm/trunk/test/Transforms/Mem2Reg/ConvertDebugInfo.ll
>> Modified:
>> llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp?rev=94493&r1=94492&r2=94493&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Jan 25 20:42:15 2010
>> @@ -23,6 +23,8 @@
>> #include "llvm/Function.h"
>> #include "llvm/Instructions.h"
>> #include "llvm/IntrinsicInst.h"
>> +#include "llvm/Metadata.h"
>> +#include "llvm/Analysis/DebugInfo.h"
>> #include "llvm/Analysis/Dominators.h"
>> #include "llvm/Analysis/AliasSetTracker.h"
>> #include "llvm/ADT/DenseMap.h"
>> @@ -83,6 +85,17 @@
>> return true;
>> }
>>
>> +/// Finds the llvm.dbg.declare intrinsic describing V, if any.
>> +static DbgDeclareInst *findDbgDeclare(Value *V) {
>> + if (MDNode *DebugNode = MDNode::getIfExists(V->getContext(), &V, 1))
>> + for (Value::use_iterator UI = DebugNode->use_begin(),
>> + E = DebugNode->use_end(); UI != E; ++UI)
>> + if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(*UI))
>> + return DDI;
>> +
>> + return 0;
>> +}
>> +
>> namespace {
>> struct AllocaInfo;
>>
>> @@ -163,6 +176,7 @@
>> std::vector<AllocaInst*> Allocas;
>> DominatorTree &DT;
>> DominanceFrontier &DF;
>> + DIFactory *DIF;
>>
>> /// AST - An AliasSetTracker object to update. If null, don't update it.
>> ///
>> @@ -186,6 +200,11 @@
>> ///
>> std::vector<Value*> PointerAllocaValues;
>>
>> + /// AllocaDbgDeclares - For each alloca, we keep track of the dbg.declare
>> + /// intrinsic that describes it, if any, so that we can convert it to a
>> + /// dbg.value intrinsic if the alloca gets promoted.
>> + std::vector<DbgDeclareInst*> AllocaDbgDeclares;
>
> Pl. use SmallVector here.
>
>> +
>> /// Visited - The set of basic blocks the renamer has already visited.
>> ///
>> SmallPtrSet<BasicBlock*, 16> Visited;
>> @@ -199,7 +218,7 @@
>> public:
>> PromoteMem2Reg(const std::vector<AllocaInst*> &A, DominatorTree &dt,
>> DominanceFrontier &df, AliasSetTracker *ast)
>> - : Allocas(A), DT(dt), DF(df), AST(ast) {}
>> + : Allocas(A), DT(dt), DF(df), DIF(0), AST(ast) {}
>>
>> void run();
>>
>> @@ -241,6 +260,8 @@
>> LargeBlockInfo &LBI);
>> void PromoteSingleBlockAlloca(AllocaInst *AI, AllocaInfo &Info,
>> LargeBlockInfo &LBI);
>> + void ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI, StoreInst *SI,
>> + uint64_t Offset);
>>
>>
>> void RenamePass(BasicBlock *BB, BasicBlock *Pred,
>> @@ -259,6 +280,7 @@
>> bool OnlyUsedInOneBlock;
>>
>> Value *AllocaPointerVal;
>> + DbgDeclareInst *DbgDeclare;
>>
>> void clear() {
>> DefiningBlocks.clear();
>> @@ -267,6 +289,7 @@
>> OnlyBlock = 0;
>> OnlyUsedInOneBlock = true;
>> AllocaPointerVal = 0;
>> + DbgDeclare = 0;
>> }
>>
>> /// AnalyzeAlloca - Scan the uses of the specified alloca, filling in our
>> @@ -301,6 +324,8 @@
>> OnlyUsedInOneBlock = false;
>> }
>> }
>> +
>> + DbgDeclare = findDbgDeclare(AI);
>> }
>> };
>> } // end of anonymous namespace
>> @@ -310,6 +335,7 @@
>> Function &F = *DF.getRoot()->getParent();
>>
>> if (AST) PointerAllocaValues.resize(Allocas.size());
>> + AllocaDbgDeclares.resize(Allocas.size());
>>
>> AllocaInfo Info;
>> LargeBlockInfo LBI;
>> @@ -344,6 +370,8 @@
>>
>> // Finally, after the scan, check to see if the store is all that is left.
>> if (Info.UsingBlocks.empty()) {
>> + // Record debuginfo for the store before removing it.
>> + ConvertDebugDeclareToDebugValue(Info.DbgDeclare, Info.OnlyStore, 0);
>> // Remove the (now dead) store and alloca.
>> Info.OnlyStore->eraseFromParent();
>> LBI.deleteValue(Info.OnlyStore);
>> @@ -372,6 +400,8 @@
>> // Remove the (now dead) stores and alloca.
>> while (!AI->use_empty()) {
>> StoreInst *SI = cast<StoreInst>(AI->use_back());
>> + // Record debuginfo for the store before removing it.
>> + ConvertDebugDeclareToDebugValue(Info.DbgDeclare, SI, 0);
>> SI->eraseFromParent();
>> LBI.deleteValue(SI);
>> }
>> @@ -400,6 +430,9 @@
>> // stored into the alloca.
>> if (AST)
>> PointerAllocaValues[AllocaNum] = Info.AllocaPointerVal;
>> +
>> + // Remember the dbg.declare intrinsic describing this alloca, if any.
>> + if (Info.DbgDeclare) AllocaDbgDeclares[AllocaNum] = Info.DbgDeclare;
>>
>> // Keep the reverse mapping of the 'Allocas' array for the rename pass.
>> AllocaLookup[Allocas[AllocaNum]] = AllocaNum;
>> @@ -833,6 +866,22 @@
>> }
>> }
>>
>> +// Inserts a llvm.dbg.value instrinsic before the stores to an alloca'd value
>> +// that has an associated llvm.dbg.decl intrinsic.
>> +void PromoteMem2Reg::ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,
>> + StoreInst *SI,
>> + uint64_t Offset) {
>> + if (!DDI)
>> + return;
>> +
>> + DIVariable DIVar(DDI->getVariable());
>> + if (!DIVar.getNode())
>> + return;
>> +
>> + if (!DIF)
>> + DIF = new DIFactory(*SI->getParent()->getParent()->getParent());
>
> Don't forget to delete DIFactory :)
>
> -
> Devang
>
>> + DIF->InsertDbgValueIntrinsic(SI->getOperand(0), Offset, DIVar, SI);
>> +}
>>
>> // QueuePhiNode - queues a phi-node to be added to a basic-block for a specific
>> // Alloca returns true if there wasn't already a phi-node for that variable
>> @@ -946,6 +995,8 @@
>>
>> // what value were we writing?
>> IncomingVals[ai->second] = SI->getOperand(0);
>> + // Record debuginfo for the store before removing it.
>> + ConvertDebugDeclareToDebugValue(AllocaDbgDeclares[ai->second], SI, 0);
>> BB->getInstList().erase(SI);
>> }
>> }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> -
> Devang
More information about the llvm-commits
mailing list