[llvm] r227604 - Inliner: Use replaceDbgDeclareForAlloca() instead of splicing the

Robinson, Paul Paul_Robinson at playstation.sony.com
Wed Feb 4 14:02:26 PST 2015


> > On Feb 4, 2015, at 12:06 PM, Robinson, Paul
> <Paul_Robinson at playstation.sony.com> wrote:
> >
> > Hi Adrian,
> > It turns out r227544 was causing a -g compilation to hang for us, I've
> > attached the reduced C++ source.  This patch fixed it, so I don't know
> > whether you want to add this as a test case or not bother.
> 
> Thanks, I received a similar report from Alexei see the thread for
> r227544. I don’t really know what else to test for besides that the
> testcase terminates so I didn’t add a separate  testcase for the infinite
> loop.
> 
> >
> > Incidentally in looking closer at the patch, we had one question,
> > see inline comment below.
> > Thanks,
> > --paulr
> >
> >> Author: adrian
> >> Date: Fri Jan 30 13:37:48 2015
> >> New Revision: 227604
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=227604&view=rev
> >> Log:
> >> Inliner: Use replaceDbgDeclareForAlloca() instead of splicing the
> >> instruction and generalize it to optionally dereference the variable.
> >> Follow-up to r227544.
> >>
> >> Modified:
> >>    llvm/trunk/include/llvm/Transforms/Utils/Local.h
> >>    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> >>    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
> >>    llvm/trunk/lib/Transforms/Utils/Local.cpp
> >>    llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare.ll
> >>    llvm/trunk/test/Transforms/Inline/inline_dbg_declare.ll
> >>
> >> Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
> >> URL: http://llvm.org/viewvc/llvm-
> >>
> project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=227604&r1=227
> >> 603&r2=227604&view=diff
> >>
> ==========================================================================
> >> ====
> >> --- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
> >> +++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Fri Jan 30
> 13:37:48
> >> 2015
> >> @@ -274,10 +274,11 @@ bool LowerDbgDeclare(Function &F);
> >> /// an alloca, if any.
> >> DbgDeclareInst *FindAllocaDbgDeclare(Value *V);
> >>
> >> -/// replaceDbgDeclareForAlloca - Replaces llvm.dbg.declare instruction
> >> when
> >> -/// alloca is replaced with a new value.
> >> +/// \brief Replaces llvm.dbg.declare instruction when an alloca is
> >> replaced with
> >> +/// a new value.  If Deref is true, tan additional DW_OP_deref is
> >> prepended to
> >> +/// the expression.
> >> bool replaceDbgDeclareForAlloca(AllocaInst *AI, Value
> *NewAllocaAddress,
> >> -                                DIBuilder &Builder);
> >> +                                DIBuilder &Builder, bool Deref);
> >>
> >> /// \brief Remove all blocks that can not be reached from the
> function's
> >> entry.
> >> ///
> >>
> >> Modified:
> llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> >> URL: http://llvm.org/viewvc/llvm-
> >>
> project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev
> >> =227604&r1=227603&r2=227604&view=diff
> >>
> ==========================================================================
> >> ====
> >> --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> >> (original)
> >> +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Fri
> Jan
> >> 30 13:37:48 2015
> >> @@ -1739,7 +1739,7 @@ void FunctionStackPoisoner::poisonStack(
> >>     Value *NewAllocaPtr = IRB.CreateIntToPtr(
> >>         IRB.CreateAdd(LocalStackBase, ConstantInt::get(IntptrTy,
> >> Desc.Offset)),
> >>         AI->getType());
> >> -    replaceDbgDeclareForAlloca(AI, NewAllocaPtr, DIB);
> >> +    replaceDbgDeclareForAlloca(AI, NewAllocaPtr, DIB, /*Deref=*/true);
> >>     AI->replaceAllUsesWith(NewAllocaPtr);
> >>   }
> >>
> >>
> >> Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
> >> URL: http://llvm.org/viewvc/llvm-
> >>
> project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=227604&r1=2
> >> 27603&r2=227604&view=diff
> >>
> ==========================================================================
> >> ====
> >> --- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
> >> +++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Fri Jan 30
> 13:37:48
> >> 2015
> >> @@ -30,6 +30,7 @@
> >> #include "llvm/IR/DataLayout.h"
> >> #include "llvm/IR/DebugInfo.h"
> >> #include "llvm/IR/DerivedTypes.h"
> >> +#include "llvm/IR/DIBuilder.h"
> >> #include "llvm/IR/Dominators.h"
> >> #include "llvm/IR/IRBuilder.h"
> >> #include "llvm/IR/Instructions.h"
> >> @@ -1112,13 +1113,10 @@ bool llvm::InlineFunction(CallSite CS, I
> >>                                                    AI, I);
> >>     }
> >>     // Move any dbg.declares describing the allocas into the entry
> basic
> >> block.
> >> +    DIBuilder DIB(*Caller->getParent());
> >>     for (auto &I : IFI.StaticAllocas)
> >>       if (auto AI = dyn_cast<AllocaInst>(I))
> >> -        if (auto *DDI = FindAllocaDbgDeclare(AI))
> >> -          if (DDI->getParent() != Caller->begin())
> >> -            Caller->getEntryBlock().getInstList()
> >> -              .splice(AI->getNextNode(), FirstNewBlock->getInstList(),
> >> -                      DDI, DDI->getNextNode());
> >> +        replaceDbgDeclareForAlloca(AI, AI, DIB, /*Deref=*/false);
> >>   }
> >>
> >>   bool InlinedMustTailCalls = false;
> >>
> >> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
> >> URL: http://llvm.org/viewvc/llvm-
> >>
> project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=227604&r1=227603&r2=
> >> 227604&view=diff
> >>
> ==========================================================================
> >> ====
> >> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> >> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Fri Jan 30 13:37:48 2015
> >> @@ -1106,10 +1106,11 @@ DbgDeclareInst *llvm::FindAllocaDbgDecla
> >> }
> >>
> >> bool llvm::replaceDbgDeclareForAlloca(AllocaInst *AI, Value
> >> *NewAllocaAddress,
> >> -                                      DIBuilder &Builder) {
> >> +                                      DIBuilder &Builder, bool Deref)
> {
> >>   DbgDeclareInst *DDI = FindAllocaDbgDeclare(AI);
> >>   if (!DDI)
> >>     return false;
> >> +  DebugLoc Loc = DDI->getDebugLoc();
> >>   DIVariable DIVar(DDI->getVariable());
> >>   DIExpression DIExpr(DDI->getExpression());
> >>   assert((!DIVar || DIVar.isVariable()) &&
> >> @@ -1117,21 +1118,24 @@ bool llvm::replaceDbgDeclareForAlloca(Al
> >>   if (!DIVar)
> >>     return false;
> >>
> >> -  // Create a copy of the original DIDescriptor for user variable,
> >> prepending
> >> -  // "deref" operation to a list of address elements, as new
> >> llvm.dbg.declare
> >> -  // will take a value storing address of the memory for variable, not
> >> -  // alloca itself.
> >> -  SmallVector<int64_t, 4> NewDIExpr;
> >> -  NewDIExpr.push_back(dwarf::DW_OP_deref);
> >> -  if (DIExpr)
> >> -    for (unsigned i = 0, n = DIExpr.getNumElements(); i < n; ++i)
> >> -      NewDIExpr.push_back(DIExpr.getElement(i));
> >> +  if (Deref) {
> >> +    // Create a copy of the original DIDescriptor for user variable,
> >> prepending
> >> +    // "deref" operation to a list of address elements, as new
> >> llvm.dbg.declare
> >> +    // will take a value storing address of the memory for variable,
> not
> >> +    // alloca itself.
> >> +    SmallVector<int64_t, 4> NewDIExpr;
> >> +    NewDIExpr.push_back(dwarf::DW_OP_deref);
> >> +    if (DIExpr)
> >
> > Does it really happen that you have Deref true but no DIExpr?
> > The result would be a DWARF expression consisting of just a deref.
> 
> Not sure if I got the question — this seems to be the common usecase in
> Transforms/Instrumentations/AddressSanitizer.cpp were normal variables are
> lowered into indirect references inside a buffer.

So, you (can) end up building a new DIExpr that is nothing but DW_OP_deref;
is the address-to-be-deref'd added somewhere else?  Or is that what the
Builder.insertDeclare() below is doing?  I haven't spent a lot of time
understanding how all the builder pieces fit together.
Thanks,
--paulr

> 
> -- adrian
> >
> >> +      for (unsigned i = 0, n = DIExpr.getNumElements(); i < n; ++i)
> >> +        NewDIExpr.push_back(DIExpr.getElement(i));
> >> +    DIExpr = Builder.createExpression(NewDIExpr);
> >> +  }
> >>
> >>   // Insert llvm.dbg.declare in the same basic block as the original
> >> alloca,
> >>   // and remove old llvm.dbg.declare.
> >>   BasicBlock *BB = AI->getParent();
> >> -  Builder.insertDeclare(NewAllocaAddress, DIVar,
> >> -                        Builder.createExpression(NewDIExpr), BB);
> >> +  Builder.insertDeclare(NewAllocaAddress, DIVar, DIExpr, BB)
> >> +    ->setDebugLoc(Loc);
> >>   DDI->eraseFromParent();
> >>   return true;
> >> }
> >>
> >> Modified: llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare.ll
> >> URL: http://llvm.org/viewvc/llvm-
> >> project/llvm/trunk/test/Transforms/Inline/alloca-
> >> dbgdeclare.ll?rev=227604&r1=227603&r2=227604&view=diff
> >>
> ==========================================================================
> >> ====
> >> --- llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare.ll (original)
> >> +++ llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare.ll Fri Jan 30
> >> 13:37:48 2015
> >> @@ -40,7 +40,7 @@ entry:
> >> ; CHECK: define void @_Z3fn5v()
> >> ; CHECK-NEXT: entry:
> >> ; CHECK-NEXT:   %agg.tmp.sroa.3.i = alloca [20 x i8], align 4
> >> -; CHECK-NEXT:   tail call void @llvm.dbg.declare(metadata [20 x i8]*
> >> %agg.tmp.sroa.3.i,
> >> +; CHECK-NEXT:   call void @llvm.dbg.declare(metadata [20 x i8]*
> >> %agg.tmp.sroa.3.i,
> >>   %agg.tmp.sroa.3 = alloca [20 x i8], align 4
> >>   tail call void @llvm.dbg.declare(metadata [20 x i8]* %agg.tmp.sroa.3,
> >> metadata !46, metadata !48), !dbg !49
> >>   %agg.tmp.sroa.0.0.copyload = load i32* getelementptr inbounds
> >> (%struct.A* @b, i64 0, i32 0), align 8, !dbg !50
> >>
> >> Modified: llvm/trunk/test/Transforms/Inline/inline_dbg_declare.ll
> >> URL: http://llvm.org/viewvc/llvm-
> >>
> project/llvm/trunk/test/Transforms/Inline/inline_dbg_declare.ll?rev=227604
> >> &r1=227603&r2=227604&view=diff
> >>
> ==========================================================================
> >> ====
> >> --- llvm/trunk/test/Transforms/Inline/inline_dbg_declare.ll (original)
> >> +++ llvm/trunk/test/Transforms/Inline/inline_dbg_declare.ll Fri Jan 30
> >> 13:37:48 2015
> >> @@ -92,6 +92,6 @@ attributes #1 = { nounwind readnone }
> >> !22 = !MDLocation(line: 8, column: 14, scope: !9)
> >> !23 = !MDLocation(line: 9, column: 1, scope: !9)
> >>
> >> -; CHECK: [[m23]] = !{!"0x101\00x\0016777217\000", !4, !5, !8,
> >> [[CALL_SITE:![0-9]*]]} ; [ DW_TAG_arg_variable ] [x] [line 1]
> >> -; CHECK: [[CALL_SITE]] = distinct !MDLocation(line: 8, column: 14,
> scope:
> >> !9)
> >> +; CHECK: [[CALL_SITE:![0-9]+]] = distinct !MDLocation(line: 8, column:
> >> 14, scope: !9)
> >> +; CHECK: [[m23]] = !{!"0x101\00x\0016777217\000", !4, !5, !8,
> >> [[CALL_SITE]]} ; [ DW_TAG_arg_variable ] [x] [line 1]
> >> ; CHECK: [[m24]] = !MDLocation(line: 1, column: 17, scope: !4,
> inlinedAt:
> >> [[CALL_SITE]])
> >>
> >>
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> > <bz96056.cpp>





More information about the llvm-commits mailing list