[llvm] r207235 - This reapplies r207130 with an additional testcase+and a missing check for

Alexey Samsonov samsonov at google.com
Fri Apr 25 11:07:29 PDT 2014


FYI this probably leads to Clang crashes on the bot:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/9295
Could you please investigate or revert?


On Fri, Apr 25, 2014 at 10:25 AM, Adrian Prantl <aprantl at apple.com> wrote:

> Absolutely!
> This and the arrays.ll testcase is pretty much the diff between the two
> patches.
>
>
> --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> @@ -992,11 +992,11 @@ void
> SelectionDAGBuilder::resolveDanglingDebugInfo(const Value *V,
>      unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
>      MDNode *Variable = DI->getVariable();
>      uint64_t Offset = DI->getOffset();
> -    // A dbg.value for an alloca is always indirect.
> -    bool IsIndirect = isa<AllocaInst>(V) || Offset != 0;
> +    // FIXME: This does not handle indirect values at offset 0.
> +    bool IsIndirect = (Offset != 0);
>      SDDbgValue *SDV;
>      if (Val.getNode()) {
> -      if (!EmitFuncArgumentDbgValue(V, Variable, Offset, IsIndirect,
> Val)) {
> +      if (!EmitFuncArgumentDbgValue(V, Variable, Offset, Val)) {
>          SDV = DAG.getDbgValue(Variable, Val.getNode(),
>                                Val.getResNo(), IsIndirect,
>                               Offset, dl, DbgSDNodeOrder);
> @@ -4547,7 +4547,7 @@ static unsigned getTruncatedArgReg(const SDValue &N)
> {
>  /// At the end of instruction selection, they will be inserted to the
> entry BB.
>  bool
>  SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode
> *Variable,
> -                                              int64_t Offset, bool
> IsIndirect,
> +                                              int64_t Offset,
>                                                const SDValue &N) {
>    const Argument *Arg = dyn_cast<Argument>(V);
>    if (!Arg)
> @@ -4599,6 +4599,8 @@ SelectionDAGBuilder::EmitFuncArgumentDbgValue(const
> Value *V, MDNode *Variable,
>    if (!Op)
>      return false;
>
> +  // FIXME: This does not handle register-indirect values at offset 0.
> +  bool IsIndirect = Offset != 0;
>    if (Op->isReg())
>      FuncInfo.ArgDbgValues.push_back(BuildMI(MF, getCurDebugLoc(),
>
>  TII->get(TargetOpcode::DBG_VALUE),
> @@ -4750,7 +4752,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const
> CallInst &I, unsigned Intrinsic) {
>          else {
>            // Address is an argument, so try to emit its dbg value using
>            // virtual register info from the FuncInfo.ValueMap.
> -          EmitFuncArgumentDbgValue(Address, Variable, 0, false, N);
> +          EmitFuncArgumentDbgValue(Address, Variable, 0, N);
>            return nullptr;
>          }
>        } else if (AI)
> @@ -4767,7 +4769,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const
> CallInst &I, unsigned Intrinsic) {
>      } else {
>        // If Address is an argument then try to emit its dbg value using
>        // virtual register info from the FuncInfo.ValueMap.
> -      if (!EmitFuncArgumentDbgValue(Address, Variable, 0, false, N)) {
> +      if (!EmitFuncArgumentDbgValue(Address, Variable, 0, N)) {
>          // If variable is pinned by a alloca in dominating bb then
>          // use StaticAllocaMap.
>          if (const AllocaInst *AI = dyn_cast<AllocaInst>(Address)) {
> @@ -4813,9 +4815,9 @@ SelectionDAGBuilder::visitIntrinsicCall(const
> CallInst &I, unsigned Intrinsic) {
>          // Check unused arguments map.
>          N = UnusedArgNodeMap[V];
>        if (N.getNode()) {
> -        // A dbg.value for an alloca is always indirect.
> -        bool IsIndirect = isa<AllocaInst>(V) || Offset != 0;
> -        if (!EmitFuncArgumentDbgValue(V, Variable, Offset, IsIndirect,
> N)) {
> +        if (!EmitFuncArgumentDbgValue(V, Variable, Offset, N)) {
> +         // A dbg.value for an alloca is always indirect.
> +         bool IsIndirect(isa<AllocaInst>(V));
>            SDV = DAG.getDbgValue(Variable, N.getNode(),
>                                  N.getResNo(), IsIndirect,
>                                 Offset, dl, SDNodeOrder);
> diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> index fb29691..a04108d 100644
> --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> @@ -785,8 +785,7 @@ private:
>    /// corresponding DBG_VALUE machine instruction for it now. At the end
> of
>    /// instruction selection, they will be inserted to the entry BB.
>    bool EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,
> -                                int64_t Offset, bool IsIndirect,
> -                                const SDValue &N);
> +                                int64_t Offset, const SDValue &N);
>  };
>
>  } // end namespace llvm
> :
>
> I’m moving the IsIndirect handling out of EmitFuncArgumentDbgValue (this
> is functionally identical and could have been a separate patch). The bugfix
> was that I forgot to make that very first change in the diff in
> resolveDanglingDebugInfo(). I had the same change in visitIntrinsicCall()
> but forgot to also make it in resolveDanglingDebugInfo().
>
> -- adrian
>
> On Apr 25, 2014, at 10:17 AM, Eric Christopher <echristo at gmail.com> wrote:
>
> > On Fri, Apr 25, 2014 at 10:01 AM, Adrian Prantl <aprantl at apple.com>
> wrote:
> >> Author: adrian
> >> Date: Fri Apr 25 12:01:00 2014
> >> New Revision: 207235
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=207235&view=rev
> >> Log:
> >> This reapplies r207130 with an additional testcase+and a missing check
> for
> >> AllocaInst that was missing in one location.
> >
> > Can you be more specific here? :) It's a big patch and "one location"
> > is a bit vague.
> >
> > -eric
> >
> >> Debug info for optimized code: Support variables that are on the stack
> and
> >> described by DBG_VALUEs during their lifetime.
> >>
> >> Previously, when a variable was at a FrameIndex for any part of its
> >> lifetime, this would shadow all other DBG_VALUEs and only a single
> >> fbreg location would be emitted, which in fact is only valid for a small
> >> range and not the entire lexical scope of the variable. The included
> >> dbg-value-const-byref testcase demonstrates this.
> >>
> >> This patch fixes this by
> >> Local
> >> - emitting dbg.value intrinsics for allocas that are passed by reference
> >> - dropping all dbg.declares (they are now fully lowered to dbg.values)
> >> SelectionDAG
> >> - renamed constructors for SDDbgValue for better readability.
> >> - fix UserValue::match() to handle indirect values correctly
> >> - not inserting an MMI table entries for dbg.values that describe
> allocas.
> >> - lowering dbg.values that describe allocas into *indirect* DBG_VALUEs.
> >> CodeGenPrepare
> >> - leaving dbg.values for an alloca were they are (see comment)
> >> Other
> >> - regenerated/updated instcombine.ll testcase and included source
> >>
> >> rdar://problem/16679879
> >> http://reviews.llvm.org/D3374
> >>
> >> Added:
> >>    llvm/trunk/test/DebugInfo/X86/array.ll
> >> Modified:
> >>    llvm/trunk/include/llvm/CodeGen/SelectionDAG.h
> >>    llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
> >>    llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp
> >>    llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
> >>    llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h
> >>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> >>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> >>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> >>    llvm/trunk/lib/Transforms/Utils/Local.cpp
> >>    llvm/trunk/test/DebugInfo/X86/dbg-value-const-byref.ll
> >>    llvm/trunk/test/DebugInfo/X86/instcombine-instrinsics.ll
> >>
> >> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAG.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAG.h?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/CodeGen/SelectionDAG.h (original)
> >> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAG.h Fri Apr 25 12:01:00
> 2014
> >> @@ -928,12 +928,15 @@ public:
> >>
> >>   /// getDbgValue - Creates a SDDbgValue node.
> >>   ///
> >> -  SDDbgValue *getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R,
> uint64_t Off,
> >> -                          DebugLoc DL, unsigned O);
> >> -  SDDbgValue *getDbgValue(MDNode *MDPtr, const Value *C, uint64_t Off,
> >> -                          DebugLoc DL, unsigned O);
> >> -  SDDbgValue *getDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off,
> >> +  SDDbgValue *getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R,
> >> +                         bool IsIndirect, uint64_t Off,
> >>                           DebugLoc DL, unsigned O);
> >> +  /// Constant.
> >> +  SDDbgValue *getConstantDbgValue(MDNode *MDPtr, const Value *C,
> uint64_t Off,
> >> +                                 DebugLoc DL, unsigned O);
> >> +  /// Frame index.
> >> +  SDDbgValue *getFrameIndexDbgValue(MDNode *MDPtr, unsigned FI,
> uint64_t Off,
> >> +                                   DebugLoc DL, unsigned O);
> >>
> >>   /// RemoveDeadNode - Remove the specified node from the system. If
> any of its
> >>   /// operands then becomes dead, remove them as well. Inform
> UpdateListener
> >>
> >> Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
> >> +++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Fri Apr 25 12:01:00 2014
> >> @@ -3470,7 +3470,12 @@ bool CodeGenPrepare::PlaceDbgValues(Func
> >>     for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI !=
> BE;) {
> >>       Instruction *Insn = BI; ++BI;
> >>       DbgValueInst *DVI = dyn_cast<DbgValueInst>(Insn);
> >> -      if (!DVI) {
> >> +      // Leave dbg.values that refer to an alloca alone. These
> >> +      // instrinsics describe the address of a variable (= the alloca)
> >> +      // being taken.  They should not be moved next to the alloca
> >> +      // (and to the beginning of the scope), but rather stay close to
> >> +      // where said address is used.
> >> +      if (!DVI || (DVI->getValue() &&
> isa<AllocaInst>(DVI->getValue()))) {
> >>         PrevNonDbgInst = Insn;
> >>         continue;
> >>       }
> >>
> >> Modified: llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp (original)
> >> +++ llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp Fri Apr 25 12:01:00
> 2014
> >> @@ -157,8 +157,8 @@ public:
> >>   UserValue *getNext() const { return next; }
> >>
> >>   /// match - Does this UserValue match the parameters?
> >> -  bool match(const MDNode *Var, unsigned Offset) const {
> >> -    return Var == variable && Offset == offset;
> >> +  bool match(const MDNode *Var, unsigned Offset, bool indirect) const {
> >> +    return Var == variable && Offset == offset && indirect ==
> IsIndirect;
> >>   }
> >>
> >>   /// merge - Merge equivalence classes.
> >> @@ -427,7 +427,7 @@ UserValue *LDVImpl::getUserValue(const M
> >>     UserValue *UV = Leader->getLeader();
> >>     Leader = UV;
> >>     for (; UV; UV = UV->getNext())
> >> -      if (UV->match(Var, Offset))
> >> +      if (UV->match(Var, Offset, IsIndirect))
> >>         return UV;
> >>   }
> >>
> >>
> >> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original)
> >> +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Fri Apr 25
> 12:01:00 2014
> >> @@ -688,10 +688,13 @@ InstrEmitter::EmitDbgValue(SDDbgValue *S
> >>     MIB.addReg(0U);
> >>   }
> >>
> >> -  if (Offset != 0) // Indirect addressing.
> >> +  // Indirect addressing is indicated by an Imm as the second
> parameter.
> >> +  if (SD->isIndirect())
> >>     MIB.addImm(Offset);
> >> -  else
> >> +  else {
> >> +    assert(Offset == 0 && "direct value cannot have an offset");
> >>     MIB.addReg(0U, RegState::Debug);
> >> +  }
> >>
> >>   MIB.addMetadata(MDPtr);
> >>
> >>
> >> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h (original)
> >> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h Fri Apr 25
> 12:01:00 2014
> >> @@ -45,14 +45,17 @@ private:
> >>     unsigned FrameIx;       // valid for stack objects
> >>   } u;
> >>   MDNode *mdPtr;
> >> +  bool IsIndirect;
> >>   uint64_t Offset;
> >>   DebugLoc DL;
> >>   unsigned Order;
> >>   bool Invalid;
> >> public:
> >>   // Constructor for non-constants.
> >> -  SDDbgValue(MDNode *mdP, SDNode *N, unsigned R, uint64_t off,
> DebugLoc dl,
> >> -             unsigned O) : mdPtr(mdP), Offset(off), DL(dl), Order(O),
> >> +  SDDbgValue(MDNode *mdP, SDNode *N, unsigned R,
> >> +            bool indir, uint64_t off, DebugLoc dl,
> >> +             unsigned O) : mdPtr(mdP), IsIndirect(indir),
> >> +                          Offset(off), DL(dl), Order(O),
> >>                            Invalid(false) {
> >>     kind = SDNODE;
> >>     u.s.Node = N;
> >> @@ -62,14 +65,16 @@ public:
> >>   // Constructor for constants.
> >>   SDDbgValue(MDNode *mdP, const Value *C, uint64_t off, DebugLoc dl,
> >>              unsigned O) :
> >> -    mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) {
> >> +    mdPtr(mdP), IsIndirect(false), Offset(off), DL(dl), Order(O),
> >> +    Invalid(false) {
> >>     kind = CONST;
> >>     u.Const = C;
> >>   }
> >>
> >>   // Constructor for frame indices.
> >>   SDDbgValue(MDNode *mdP, unsigned FI, uint64_t off, DebugLoc dl,
> unsigned O) :
> >> -    mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) {
> >> +    mdPtr(mdP), IsIndirect(false), Offset(off), DL(dl), Order(O),
> >> +    Invalid(false) {
> >>     kind = FRAMEIX;
> >>     u.FrameIx = FI;
> >>   }
> >> @@ -92,6 +97,9 @@ public:
> >>   // Returns the FrameIx for a stack object
> >>   unsigned getFrameIx() { assert (kind==FRAMEIX); return u.FrameIx; }
> >>
> >> +  // Returns whether this is an indirect value.
> >> +  bool isIndirect() { return IsIndirect; }
> >> +
> >>   // Returns the offset.
> >>   uint64_t getOffset() { return Offset; }
> >>
> >>
> >> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
> >> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Apr 25
> 12:01:00 2014
> >> @@ -5646,21 +5646,26 @@ SDNode *SelectionDAG::getNodeIfExists(un
> >>
> >> /// getDbgValue - Creates a SDDbgValue node.
> >> ///
> >> +/// SDNode
> >> SDDbgValue *
> >> -SelectionDAG::getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R,
> uint64_t Off,
> >> +SelectionDAG::getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R,
> >> +                         bool IsIndirect, uint64_t Off,
> >>                           DebugLoc DL, unsigned O) {
> >> -  return new (Allocator) SDDbgValue(MDPtr, N, R, Off, DL, O);
> >> +  return new (Allocator) SDDbgValue(MDPtr, N, R, IsIndirect, Off, DL,
> O);
> >> }
> >>
> >> +/// Constant
> >> SDDbgValue *
> >> -SelectionDAG::getDbgValue(MDNode *MDPtr, const Value *C, uint64_t Off,
> >> -                          DebugLoc DL, unsigned O) {
> >> +SelectionDAG::getConstantDbgValue(MDNode *MDPtr, const Value *C,
> >> +                                 uint64_t Off,
> >> +                                 DebugLoc DL, unsigned O) {
> >>   return new (Allocator) SDDbgValue(MDPtr, C, Off, DL, O);
> >> }
> >>
> >> +/// FrameIndex
> >> SDDbgValue *
> >> -SelectionDAG::getDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off,
> >> -                          DebugLoc DL, unsigned O) {
> >> +SelectionDAG::getFrameIndexDbgValue(MDNode *MDPtr, unsigned FI,
> uint64_t Off,
> >> +                                   DebugLoc DL, unsigned O) {
> >>   return new (Allocator) SDDbgValue(MDPtr, FI, Off, DL, O);
> >> }
> >>
> >> @@ -6066,6 +6071,7 @@ void SelectionDAG::TransferDbgValues(SDV
> >>     SDDbgValue *Dbg = *I;
> >>     if (Dbg->getKind() == SDDbgValue::SDNODE) {
> >>       SDDbgValue *Clone = getDbgValue(Dbg->getMDPtr(), ToNode,
> To.getResNo(),
> >> +                                     Dbg->isIndirect(),
> >>                                       Dbg->getOffset(),
> Dbg->getDebugLoc(),
> >>                                       Dbg->getOrder());
> >>       ClonedDVs.push_back(Clone);
> >>
> >> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> (original)
> >> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Fri Apr
> 25 12:01:00 2014
> >> @@ -992,11 +992,14 @@ void SelectionDAGBuilder::resolveDanglin
> >>     unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
> >>     MDNode *Variable = DI->getVariable();
> >>     uint64_t Offset = DI->getOffset();
> >> +    // A dbg.value for an alloca is always indirect.
> >> +    bool IsIndirect = isa<AllocaInst>(V) || Offset != 0;
> >>     SDDbgValue *SDV;
> >>     if (Val.getNode()) {
> >> -      if (!EmitFuncArgumentDbgValue(V, Variable, Offset, Val)) {
> >> +      if (!EmitFuncArgumentDbgValue(V, Variable, Offset, IsIndirect,
> Val)) {
> >>         SDV = DAG.getDbgValue(Variable, Val.getNode(),
> >> -                              Val.getResNo(), Offset, dl,
> DbgSDNodeOrder);
> >> +                              Val.getResNo(), IsIndirect,
> >> +                             Offset, dl, DbgSDNodeOrder);
> >>         DAG.AddDbgValue(SDV, Val.getNode(), false);
> >>       }
> >>     } else
> >> @@ -4544,7 +4547,7 @@ static unsigned getTruncatedArgReg(const
> >> /// At the end of instruction selection, they will be inserted to the
> entry BB.
> >> bool
> >> SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode
> *Variable,
> >> -                                              int64_t Offset,
> >> +                                              int64_t Offset, bool
> IsIndirect,
> >>                                               const SDValue &N) {
> >>   const Argument *Arg = dyn_cast<Argument>(V);
> >>   if (!Arg)
> >> @@ -4596,8 +4599,6 @@ SelectionDAGBuilder::EmitFuncArgumentDbg
> >>   if (!Op)
> >>     return false;
> >>
> >> -  // FIXME: This does not handle register-indirect values at offset 0.
> >> -  bool IsIndirect = Offset != 0;
> >>   if (Op->isReg())
> >>     FuncInfo.ArgDbgValues.push_back(BuildMI(MF, getCurDebugLoc(),
> >>
> TII->get(TargetOpcode::DBG_VALUE),
> >> @@ -4744,17 +4745,17 @@ SelectionDAGBuilder::visitIntrinsicCall(
> >>         FrameIndexSDNode *FINode =
> dyn_cast<FrameIndexSDNode>(N.getNode());
> >>         if (FINode)
> >>           // Byval parameter.  We have a frame index at this point.
> >> -          SDV = DAG.getDbgValue(Variable, FINode->getIndex(),
> >> -                                0, dl, SDNodeOrder);
> >> +          SDV = DAG.getFrameIndexDbgValue(Variable, FINode->getIndex(),
> >> +                                         0, dl, SDNodeOrder);
> >>         else {
> >>           // Address is an argument, so try to emit its dbg value using
> >>           // virtual register info from the FuncInfo.ValueMap.
> >> -          EmitFuncArgumentDbgValue(Address, Variable, 0, N);
> >> +          EmitFuncArgumentDbgValue(Address, Variable, 0, false, N);
> >>           return nullptr;
> >>         }
> >>       } else if (AI)
> >>         SDV = DAG.getDbgValue(Variable, N.getNode(), N.getResNo(),
> >> -                              0, dl, SDNodeOrder);
> >> +                              true, 0, dl, SDNodeOrder);
> >>       else {
> >>         // Can't do anything with other non-AI cases yet.
> >>         DEBUG(dbgs() << "Dropping debug info for " << DI << "\n");
> >> @@ -4766,7 +4767,7 @@ SelectionDAGBuilder::visitIntrinsicCall(
> >>     } else {
> >>       // If Address is an argument then try to emit its dbg value using
> >>       // virtual register info from the FuncInfo.ValueMap.
> >> -      if (!EmitFuncArgumentDbgValue(Address, Variable, 0, N)) {
> >> +      if (!EmitFuncArgumentDbgValue(Address, Variable, 0, false, N)) {
> >>         // If variable is pinned by a alloca in dominating bb then
> >>         // use StaticAllocaMap.
> >>         if (const AllocaInst *AI = dyn_cast<AllocaInst>(Address)) {
> >> @@ -4774,8 +4775,8 @@ SelectionDAGBuilder::visitIntrinsicCall(
> >>             DenseMap<const AllocaInst*, int>::iterator SI =
> >>               FuncInfo.StaticAllocaMap.find(AI);
> >>             if (SI != FuncInfo.StaticAllocaMap.end()) {
> >> -              SDV = DAG.getDbgValue(Variable, SI->second,
> >> -                                    0, dl, SDNodeOrder);
> >> +              SDV = DAG.getFrameIndexDbgValue(Variable, SI->second,
> >> +                                              0, dl, SDNodeOrder);
> >>               DAG.AddDbgValue(SDV, nullptr, false);
> >>               return nullptr;
> >>             }
> >> @@ -4802,7 +4803,7 @@ SelectionDAGBuilder::visitIntrinsicCall(
> >>
> >>     SDDbgValue *SDV;
> >>     if (isa<ConstantInt>(V) || isa<ConstantFP>(V) ||
> isa<UndefValue>(V)) {
> >> -      SDV = DAG.getDbgValue(Variable, V, Offset, dl, SDNodeOrder);
> >> +      SDV = DAG.getConstantDbgValue(Variable, V, Offset, dl,
> SDNodeOrder);
> >>       DAG.AddDbgValue(SDV, nullptr, false);
> >>     } else {
> >>       // Do not use getValue() in here; we don't want to generate code
> at
> >> @@ -4812,9 +4813,12 @@ SelectionDAGBuilder::visitIntrinsicCall(
> >>         // Check unused arguments map.
> >>         N = UnusedArgNodeMap[V];
> >>       if (N.getNode()) {
> >> -        if (!EmitFuncArgumentDbgValue(V, Variable, Offset, N)) {
> >> +        // A dbg.value for an alloca is always indirect.
> >> +        bool IsIndirect = isa<AllocaInst>(V) || Offset != 0;
> >> +        if (!EmitFuncArgumentDbgValue(V, Variable, Offset, IsIndirect,
> N)) {
> >>           SDV = DAG.getDbgValue(Variable, N.getNode(),
> >> -                                N.getResNo(), Offset, dl, SDNodeOrder);
> >> +                                N.getResNo(), IsIndirect,
> >> +                               Offset, dl, SDNodeOrder);
> >>           DAG.AddDbgValue(SDV, N.getNode(), false);
> >>         }
> >>       } else if (!V->use_empty() ) {
> >> @@ -4843,11 +4847,6 @@ SelectionDAGBuilder::visitIntrinsicCall(
> >>       FuncInfo.StaticAllocaMap.find(AI);
> >>     if (SI == FuncInfo.StaticAllocaMap.end())
> >>       return nullptr; // VLAs.
> >> -    int FI = SI->second;
> >> -
> >> -    MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI();
> >> -    if (!DI.getDebugLoc().isUnknown() && MMI.hasDebugInfo())
> >> -      MMI.setVariableDbgInfo(Variable, FI, DI.getDebugLoc());
> >>     return nullptr;
> >>   }
> >>
> >>
> >> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (original)
> >> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h Fri Apr
> 25 12:01:00 2014
> >> @@ -785,7 +785,8 @@ private:
> >>   /// corresponding DBG_VALUE machine instruction for it now. At the
> end of
> >>   /// instruction selection, they will be inserted to the entry BB.
> >>   bool EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,
> >> -                                int64_t Offset, const SDValue &N);
> >> +                                int64_t Offset, bool IsIndirect,
> >> +                                const SDValue &N);
> >> };
> >>
> >> } // end namespace llvm
> >>
> >> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> >> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Fri Apr 25 12:01:00 2014
> >> @@ -1051,20 +1051,26 @@ bool llvm::LowerDbgDeclare(Function &F)
> >>     AllocaInst *AI = dyn_cast_or_null<AllocaInst>(DDI->getAddress());
> >>     // If this is an alloca for a scalar variable, insert a dbg.value
> >>     // at each load and store to the alloca and erase the dbg.declare.
> >> +    // The dbg.values allow tracking a variable even if it is not
> >> +    // stored on the stack, while the dbg.declare can only describe
> >> +    // the stack slot (and at a lexical-scope granularity). Later
> >> +    // passes will attempt to elide the stack slot.
> >>     if (AI && !AI->isArrayAllocation()) {
> >> -
> >> -      // We only remove the dbg.declare intrinsic if all uses are
> >> -      // converted to dbg.value intrinsics.
> >> -      bool RemoveDDI = true;
> >>       for (User *U : AI->users())
> >>         if (StoreInst *SI = dyn_cast<StoreInst>(U))
> >>           ConvertDebugDeclareToDebugValue(DDI, SI, DIB);
> >>         else if (LoadInst *LI = dyn_cast<LoadInst>(U))
> >>           ConvertDebugDeclareToDebugValue(DDI, LI, DIB);
> >> -        else
> >> -          RemoveDDI = false;
> >> -      if (RemoveDDI)
> >> -        DDI->eraseFromParent();
> >> +        else if (Instruction *I = dyn_cast<Instruction>(U)) {
> >> +         // This is a call by-value or some other instruction that
> >> +         // takes a pointer to the variable. Insert a *value*
> >> +         // intrinsic that describes the alloca.
> >> +         auto DbgVal =
> >> +           DIB.insertDbgValueIntrinsic(AI, 0,
> >> +                                       DIVariable(DDI->getVariable()),
> I);
> >> +         DbgVal->setDebugLoc(I->getDebugLoc());
> >> +       }
> >> +      DDI->eraseFromParent();
> >>     }
> >>   }
> >>   return true;
> >>
> >> Added: llvm/trunk/test/DebugInfo/X86/array.ll
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/array.ll?rev=207235&view=auto
> >>
> ==============================================================================
> >> --- llvm/trunk/test/DebugInfo/X86/array.ll (added)
> >> +++ llvm/trunk/test/DebugInfo/X86/array.ll Fri Apr 25 12:01:00 2014
> >> @@ -0,0 +1,101 @@
> >> +; ModuleID = 'array.c'
> >> +;
> >> +; From (clang -g -c -O1):
> >> +;
> >> +; void f(int* p) {
> >> +;   p[0] = 42;
> >> +; }
> >> +;
> >> +; int main(int argc, char** argv) {
> >> +;   int array[4] = { 0, 1, 2, 3 };
> >> +;   f(array);
> >> +;   return array[0];
> >> +; }
> >> +;
> >> +; RUN: llc -filetype=asm %s -o - | FileCheck %s
> >> +; Test that we only emit register-indirect locations for the array
> array.
> >> +; rdar://problem/14874886
> >> +;
> >> +; CHECK:     ##DEBUG_VALUE: main:array <- [R{{.*}}+0]
> >> +; CHECK-NOT: ##DEBUG_VALUE: main:array <- R{{.*}}
> >> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> >> +target triple = "x86_64-apple-macosx10.9.0"
> >> +
> >> + at main.array = private unnamed_addr constant [4 x i32] [i32 0, i32 1,
> i32 2, i32 3], align 16
> >> +
> >> +; Function Attrs: nounwind ssp uwtable
> >> +define void @f(i32* nocapture %p) #0 {
> >> +  tail call void @llvm.dbg.value(metadata !{i32* %p}, i64 0, metadata
> !11), !dbg !28
> >> +  store i32 42, i32* %p, align 4, !dbg !29, !tbaa !30
> >> +  ret void, !dbg !34
> >> +}
> >> +
> >> +; Function Attrs: nounwind ssp uwtable
> >> +define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 {
> >> +  %array = alloca [4 x i32], align 16
> >> +  tail call void @llvm.dbg.value(metadata !{i32 %argc}, i64 0,
> metadata !19), !dbg !35
> >> +  tail call void @llvm.dbg.value(metadata !{i8** %argv}, i64 0,
> metadata !20), !dbg !35
> >> +  tail call void @llvm.dbg.value(metadata !{[4 x i32]* %array}, i64 0,
> metadata !21), !dbg !36
> >> +  %1 = bitcast [4 x i32]* %array to i8*, !dbg !36
> >> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* bitcast ([4 x i32]*
> @main.array to i8*), i64 16, i32 16, i1 false), !dbg !36
> >> +  tail call void @llvm.dbg.value(metadata !{[4 x i32]* %array}, i64 0,
> metadata !21), !dbg !36
> >> +  %2 = getelementptr inbounds [4 x i32]* %array, i64 0, i64 0, !dbg !37
> >> +  call void @f(i32* %2), !dbg !37
> >> +  tail call void @llvm.dbg.value(metadata !{[4 x i32]* %array}, i64 0,
> metadata !21), !dbg !36
> >> +  %3 = load i32* %2, align 16, !dbg !38, !tbaa !30
> >> +  ret i32 %3, !dbg !38
> >> +}
> >> +
> >> +; Function Attrs: nounwind
> >> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture
> readonly, i64, i32, i1) #1
> >> +
> >> +; Function Attrs: nounwind readnone
> >> +declare void @llvm.dbg.value(metadata, i64, metadata) #2
> >> +
> >> +attributes #0 = { nounwind ssp uwtable }
> >> +attributes #1 = { nounwind }
> >> +attributes #2 = { nounwind readnone }
> >> +
> >> +!llvm.dbg.cu = !{!0}
> >> +!llvm.module.flags = !{!25, !26}
> >> +!llvm.ident = !{!27}
> >> +
> >> +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [
> DW_TAG_compile_unit ] [/array.c] [DW_LANG_C99]
> >> +!1 = metadata !{metadata !"array.c", metadata !""}
> >> +!2 = metadata !{}
> >> +!3 = metadata !{metadata !4, metadata !12}
> >> +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f",
> metadata !"f", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 true, void (i32*)* @f, null, null, metadata !10,
> i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f]
> >> +!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type
> ] [/array.c]
> >> +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> >> +!7 = metadata !{null, metadata !8}
> >> +!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64,
> i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size
> 64, align 64, offset 0] [from int]
> >> +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64
> 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size
> 32, align 32, offset 0, enc DW_ATE_signed]
> >> +!10 = metadata !{metadata !11}
> >> +!11 = metadata !{i32 786689, metadata !4, metadata !"p", metadata !5,
> i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [p]
> [line 1]
> >> +!12 = metadata !{i32 786478, metadata !1, metadata !5, metadata
> !"main", metadata !"main", metadata !"", i32 5, metadata !13, i1 false, i1
> true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main, null,
> null, metadata !18, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [main]
> >> +!13 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> >> +!14 = metadata !{metadata !9, metadata !9, metadata !15}
> >> +!15 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64,
> i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] [line 0, size
> 64, align 64, offset 0] [from ]
> >> +!16 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64,
> i64 64, i64 0, i32 0, metadata !17} ; [ DW_TAG_pointer_type ] [line 0, size
> 64, align 64, offset 0] [from char]
> >> +!17 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64
> 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size
> 8, align 8, offset 0, enc DW_ATE_signed_char]
> >> +!18 = metadata !{metadata !19, metadata !20, metadata !21}
> >> +!19 = metadata !{i32 786689, metadata !12, metadata !"argc", metadata
> !5, i32 16777221, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ]
> [argc] [line 5]
> >> +!20 = metadata !{i32 786689, metadata !12, metadata !"argv", metadata
> !5, i32 33554437, metadata !15, i32 0, i32 0} ; [ DW_TAG_arg_variable ]
> [argv] [line 5]
> >> +!21 = metadata !{i32 786688, metadata !12, metadata !"array", metadata
> !5, i32 6, metadata !22, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [array]
> [line 6]
> >> +!22 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 128,
> i64 32, i32 0, i32 0, metadata !9, metadata !23, i32 0, null, null, null} ;
> [ DW_TAG_array_type ] [line 0, size 128, align 32, offset 0] [from int]
> >> +!23 = metadata !{metadata !24}
> >> +!24 = metadata !{i32 786465, i64 0, i64 4}        ; [
> DW_TAG_subrange_type ] [0, 3]
> >> +!25 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
> >> +!26 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> >> +!27 = metadata !{metadata !"clang version 3.5.0 "}
> >> +!28 = metadata !{i32 1, i32 0, metadata !4, null}
> >> +!29 = metadata !{i32 2, i32 0, metadata !4, null}
> >> +!30 = metadata !{metadata !31, metadata !31, i64 0}
> >> +!31 = metadata !{metadata !"int", metadata !32, i64 0}
> >> +!32 = metadata !{metadata !"omnipotent char", metadata !33, i64 0}
> >> +!33 = metadata !{metadata !"Simple C/C++ TBAA"}
> >> +!34 = metadata !{i32 3, i32 0, metadata !4, null}
> >> +!35 = metadata !{i32 5, i32 0, metadata !12, null}
> >> +!36 = metadata !{i32 6, i32 0, metadata !12, null}
> >> +!37 = metadata !{i32 7, i32 0, metadata !12, null}
> >> +!38 = metadata !{i32 8, i32 0, metadata !12, null} ; [
> DW_TAG_imported_declaration ]
> >>
> >> Modified: llvm/trunk/test/DebugInfo/X86/dbg-value-const-byref.ll
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dbg-value-const-byref.ll?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/test/DebugInfo/X86/dbg-value-const-byref.ll (original)
> >> +++ llvm/trunk/test/DebugInfo/X86/dbg-value-const-byref.ll Fri Apr 25
> 12:01:00 2014
> >> @@ -37,6 +37,10 @@
> >> ; CHECK: Beginning address offset: [[C2]]
> >> ; CHECK:    Ending address offset: [[R1:.*]]
> >> ; CHECK:     Location description: 50 93 04
> >> +;         rdi+0
> >> +; CHECK: Beginning address offset: [[R1]]
> >> +; CHECK:    Ending address offset: [[R2:.*]]
> >> +; CHECK:     Location description: 75 00
> >> ;
> >> target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> >> target triple = "x86_64-apple-macosx10.9.0"
> >> @@ -51,6 +55,7 @@ entry:
> >>   %call1 = call i32 (...)* @f1() #3, !dbg !19
> >>   call void @llvm.dbg.value(metadata !{i32 %call1}, i64 0, metadata
> !10), !dbg !19
> >>   store i32 %call1, i32* %i, align 4, !dbg !19, !tbaa !20
> >> +  call void @llvm.dbg.value(metadata !{i32* %i}, i64 0, metadata !10),
> !dbg !24
> >>   call void @f2(i32* %i) #3, !dbg !24
> >>   ret i32 0, !dbg !25
> >> }
> >>
> >> Modified: llvm/trunk/test/DebugInfo/X86/instcombine-instrinsics.ll
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/instcombine-instrinsics.ll?rev=207235&r1=207234&r2=207235&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/test/DebugInfo/X86/instcombine-instrinsics.ll (original)
> >> +++ llvm/trunk/test/DebugInfo/X86/instcombine-instrinsics.ll Fri Apr 25
> 12:01:00 2014
> >> @@ -1,102 +1,79 @@
> >> -; RUN: opt < %s -O2 -S | FileCheck %s
> >> +; RUN: opt %s -O2 -S -o - | FileCheck %s
> >> ; Verify that we emit the same intrinsic at most once.
> >> -; CHECK: call void @llvm.dbg.value(metadata !{%struct.i14** %i14}
> >> -; CHECK-NOT: call void @llvm.dbg.value(metadata !{%struct.i14** %i14}
> >> +; rdar://problem/13056109
> >> +;
> >> +; CHECK: call void @llvm.dbg.value(metadata !{%struct.i14** %p}
> >> +; CHECK-NOT: call void @llvm.dbg.value(metadata !{%struct.i14** %p}
> >> +; CHECK-NEXT: call i32 @foo
> >> ; CHECK: ret
> >> -
> >> -;*** IR Dump After Dead Argument Elimination ***
> >> -target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> >> -target triple = "x86_64-apple-macosx10.8.0"
> >> -
> >> -%struct.i3 = type { i32 }
> >> -%struct.i14 = type { i32 }
> >> -%struct.i24 = type opaque
> >> -
> >> -define %struct.i3* @barz(i64 %i9) nounwind {
> >> -entry:
> >> -  br label %while.cond
> >> -
> >> -while.cond:                                       ; preds =
> %while.body, %entry
> >> -  br label %while.body
> >> -
> >> -while.body:                                       ; preds = %while.cond
> >> -  br label %while.cond
> >> -}
> >> -
> >> -declare void @llvm.dbg.declare(metadata, metadata)
> >> -
> >> -define void @init() nounwind {
> >> -entry:
> >> -  %i14 = alloca %struct.i14*, align 8
> >> -  call void @llvm.dbg.declare(metadata !{%struct.i14** %i14}, metadata
> !25)
> >> -  store %struct.i14* null, %struct.i14** %i14, align 8
> >> -  %call = call i32 @foo(i8* bitcast (void ()* @bar to i8*),
> %struct.i14** %i14)
> >> -  %0 = load %struct.i14** %i14, align 8
> >> -  %i16 = getelementptr inbounds %struct.i14* %0, i32 0, i32 0
> >> -  %1 = load i32* %i16, align 4
> >> -  %or = or i32 %1, 4
> >> -  store i32 %or, i32* %i16, align 4
> >> -  %call4 = call i32 @foo(i8* bitcast (void ()* @baz to i8*),
> %struct.i14** %i14)
> >> -  ret void
> >> +;
> >> +;
> >> +; typedef struct {
> >> +;   long i;
> >> +; } i14;
> >> +;
> >> +; int foo(i14**);
> >> +;
> >> +;   void init() {
> >> +;     i14* p = 0;
> >> +;     foo(&p);
> >> +;     p->i |= 4;
> >> +;     foo(&p);
> >> +;   }
> >> +;
> >> +; ModuleID = 'instcombine_intrinsics.c'
> >> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> >> +target triple = "x86_64-apple-macosx10.9.0"
> >> +
> >> +%struct.i14 = type { i64 }
> >> +
> >> +; Function Attrs: nounwind ssp uwtable
> >> +define void @init() #0 {
> >> +  %p = alloca %struct.i14*, align 8
> >> +  call void @llvm.dbg.declare(metadata !{%struct.i14** %p}, metadata
> !11), !dbg !18
> >> +  store %struct.i14* null, %struct.i14** %p, align 8, !dbg !18
> >> +  %1 = call i32 @foo(%struct.i14** %p), !dbg !19
> >> +  %2 = load %struct.i14** %p, align 8, !dbg !20
> >> +  %3 = getelementptr inbounds %struct.i14* %2, i32 0, i32 0, !dbg !20
> >> +  %4 = load i64* %3, align 8, !dbg !20
> >> +  %5 = or i64 %4, 4, !dbg !20
> >> +  store i64 %5, i64* %3, align 8, !dbg !20
> >> +  %6 = call i32 @foo(%struct.i14** %p), !dbg !21
> >> +  ret void, !dbg !22
> >> }
> >>
> >> -declare i32 @foo(i8*, %struct.i14**) nounwind
> >> -
> >> -define internal void @bar() nounwind {
> >> -entry:
> >> -  %i9 = alloca i64, align 8
> >> -  store i64 0, i64* %i9, align 8
> >> -  %call = call i32 @put(i64 0, i64* %i9, i64 0, %struct.i24* null)
> >> -  ret void
> >> -}
> >> -
> >> -define internal void @baz() nounwind {
> >> -entry:
> >> -  ret void
> >> -}
> >> +; Function Attrs: nounwind readnone
> >> +declare void @llvm.dbg.declare(metadata, metadata) #1
> >>
> >> -declare i32 @put(i64, i64*, i64, %struct.i24*) nounwind readnone
> >> +declare i32 @foo(%struct.i14**)
> >>
> >> -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
> >> +attributes #0 = { nounwind ssp uwtable }
> >> +attributes #1 = { nounwind readnone }
> >>
> >> !llvm.dbg.cu = !{!0}
> >> -!llvm.module.flags = !{!73}
> >> +!llvm.module.flags = !{!8, !9}
> >> +!llvm.ident = !{!10}
> >>
> >> -!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.3 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !48, null, metadata !""} ; [ DW_TAG_compile_unit ]
> >> -!1 = metadata !{metadata !"i1", metadata !""}
> >> -!2 = metadata !{i32 0}
> >> -!3 = metadata !{metadata !4, metadata !21, metadata !33, metadata !47}
> >> -!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"i2",
> metadata !"i2", metadata !"", i32 31, metadata !6, i1 false, i1 true, i32
> 0, i32 0, null, i32 256, i1 true, %struct.i3* (i64)* @barz, null, null,
> metadata !16, i32 32} ; [ DW_TAG_subprogram ] [line 31]  [scope 32]
> >> -!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type
> ]
> >> +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [
> DW_TAG_compile_unit ] [instcombine_intrinsics.c] [DW_LANG_C99]
> >> +!1 = metadata !{metadata !"instcombine_intrinsics.c", metadata !""}
> >> +!2 = metadata !{}
> >> +!3 = metadata !{metadata !4}
> >> +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata
> !"init", metadata !"init", metadata !"", i32 7, metadata !6, i1 false, i1
> true, i32 0, i32 0, null, i32 0, i1 false, void ()* @init, null, null,
> metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [init]
> >> +!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type
> ] [instcombine_intrinsics.c]
> >> !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> >> -!7 = metadata !{metadata !8, metadata !13}
> >> -!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64,
> i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size
> 64, align 64, offset 0] [from i3]
> >> -!9 = metadata !{i32 786451, metadata !1, null, metadata !"i3", i32 25,
> i64 32, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null, null}
> ; [ DW_TAG_structure_type ] [i3] [line 25, size 32, align 32, offset 0]
> [def] [from ]
> >> -!10 = metadata !{metadata !11}
> >> -!11 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"i4",
> i32 26, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ]
>  [line 26, size 32, align 32, offset 0] [from i5]
> >> -!12 = metadata !{i32 786468, null, null, metadata !"i5", i32 0, i64
> 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ]  [line 0, size 32,
> align 32, offset 0, enc DW_ATE_unsigned]
> >> -!13 = metadata !{i32 786454, metadata !1, null, metadata !"i6", i32 5,
> i64 0, i64 0, i64 0, i32 0, metadata !14} ; [ DW_TAG_typedef ]  [line 5,
> size 0, align 0, offset 0] [from i7]
> >> -!14 = metadata !{i32 786454, metadata !1, null, metadata !"i7", i32 2,
> i64 0, i64 0, i64 0, i32 0, metadata !15} ; [ DW_TAG_typedef ]  [line 2,
> size 0, align 0, offset 0] [from i8]
> >> -!15 = metadata !{i32 786468, null, null, metadata !"i8", i32 0, i64
> 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ]  [line 0, size 64,
> align 64, offset 0, enc DW_ATE_unsigned]
> >> -!16 = metadata !{}
> >> -!21 = metadata !{i32 786478, metadata !1, metadata !5, metadata
> !"i13", metadata !"i13", metadata !"", i32 42, metadata !22, i1 false, i1
> true, i32 0, i32 0, null, i32 256, i1 true, void ()* @init, null, null,
> metadata !24, i32 43} ; [ DW_TAG_subprogram ] [line 42]  [scope 43]
> >> -!22 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !34, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> >> -!23 = metadata !{null}
> >> -!24 = metadata !{metadata !25}
> >> -!25 = metadata !{i32 786688, metadata !21, metadata !"i14", metadata
> !5, i32 45, metadata !27, i32 0, i32 0} ; [ DW_TAG_auto_variable ]  [line
> 45]
> >> -!27 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64,
> i64 64, i64 0, i32 0, metadata !28} ; [ DW_TAG_pointer_type ] [line 0, size
> 64, align 64, offset 0] [from i14]
> >> -!28 = metadata !{i32 786451, metadata !1, null, metadata !"i14", i32
> 16, i64 32, i64 32, i32 0, i32 0, null, metadata !29, i32 0, null, null,
> null} ; [ DW_TAG_structure_type ] [i14] [line 16, size 32, align 32, offset
> 0] [def] [from ]
> >> -!29 = metadata !{metadata !30}
> >> -!30 = metadata !{i32 786445, metadata !1, metadata !28, metadata
> !"i16", i32 17, i64 32, i64 32, i64 0, i32 0, metadata !31} ; [
> DW_TAG_member ]  [line 17, size 32, align 32, offset 0] [from i17]
> >> -!31 = metadata !{i32 786454, metadata !1, null, metadata !"i17", i32
> 7, i64 0, i64 0, i64 0, i32 0, metadata !32} ; [ DW_TAG_typedef ]  [line 7,
> size 0, align 0, offset 0] [from int]
> >> -!32 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64
> 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]  [line 0, size 32,
> align 32, offset 0, enc DW_ATE_signed]
> >> -!33 = metadata !{i32 786478, metadata !1, metadata !5, metadata
> !"i18", metadata !"i18", metadata !"", i32 54, metadata !22, i1 true, i1
> true, i32 0, i32 0, null, i32 256, i1 true, void ()* @bar, null, null,
> metadata !34, i32 55} ; [ DW_TAG_subprogram ] [line 54]   [scope 55]
> >> -!34 = metadata !{null}
> >> -!47 = metadata !{i32 786478, metadata !1, metadata !5, metadata
> !"i29", metadata !"i29", metadata !"", i32 53, metadata !22, i1 true, i1
> true, i32 0, i32 0, null, i32 256, i1 true, void ()* @baz, null, null,
> metadata !2, i32 53} ; [ DW_TAG_subprogram ] [line 53]
> >> -!48 = metadata !{metadata !49}
> >> -!49 = metadata !{i32 786484, i32 0, metadata !21, metadata !"i30",
> metadata !"i30", metadata !"", metadata !5, i32 44, metadata !50, i32 1,
> i32 1, null, null}
> >> -!50 = metadata !{i32 786454, metadata !1, null, metadata !"i31", i32
> 6, i64 0, i64 0, i64 0, i32 0, metadata !32} ; [ DW_TAG_typedef ]  [line 6,
> size 0, align 0, offset 0] [from int]
> >> -!52 = metadata !{i64 0}
> >> -!55 = metadata !{%struct.i3* null}
> >> -!72 = metadata !{%struct.i24* null}
> >> -!73 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> >> +!7 = metadata !{null}
> >> +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
> >> +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> >> +!10 = metadata !{metadata !"clang version 3.5.0 "}
> >> +!11 = metadata !{i32 786688, metadata !4, metadata !"p", metadata !5,
> i32 8, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [p] [line 8]
> >> +!12 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64,
> i64 64, i64 0, i32 0, metadata !13} ; [ DW_TAG_pointer_type ] [line 0, size
> 64, align 64, offset 0] [from i14]
> >> +!13 = metadata !{i32 786454, metadata !1, null, metadata !"i14", i32
> 3, i64 0, i64 0, i64 0, i32 0, metadata !14} ; [ DW_TAG_typedef ] [i14]
> [line 3, size 0, align 0, offset 0] [from ]
> >> +!14 = metadata !{i32 786451, metadata !1, null, metadata !"", i32 1,
> i64 64, i64 64, i32 0, i32 0, null, metadata !15, i32 0, null, null, null}
> ; [ DW_TAG_structure_type ] [line 1, size 64, align 64, offset 0] [def]
> [from ]
> >> +!15 = metadata !{metadata !16}
> >> +!16 = metadata !{i32 786445, metadata !1, metadata !14, metadata !"i",
> i32 2, i64 64, i64 64, i64 0, i32 0, metadata !17} ; [ DW_TAG_member ] [i]
> [line 2, size 64, align 64, offset 0] [from long int]
> >> +!17 = metadata !{i32 786468, null, null, metadata !"long int", i32 0,
> i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [long int]
> [line 0, size 64, align 64, offset 0, enc DW_ATE_signed]
> >> +!18 = metadata !{i32 8, i32 0, metadata !4, null} ; [
> DW_TAG_imported_declaration ]
> >> +!19 = metadata !{i32 9, i32 0, metadata !4, null}
> >> +!20 = metadata !{i32 10, i32 0, metadata !4, null}
> >> +!21 = metadata !{i32 11, i32 0, metadata !4, null}
> >> +!22 = metadata !{i32 12, i32 0, metadata !4, null}
> >>
> >>
> >> _______________________________________________
> >> 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
>



-- 
Alexey Samsonov, Mountain View, CA
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140425/c944fc93/attachment.html>


More information about the llvm-commits mailing list