[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