[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