[llvm-commits] [llvm] r94493 - in /llvm/trunk: lib/Transforms/Utils/PromoteMemoryToRegister.cpp test/Transforms/Mem2Reg/ConvertDebugInfo.ll

Devang Patel devang.patel at gmail.com
Tue Jan 26 10:42:13 PST 2010


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