[llvm-dev] Jump Threading duplicates dbg.declare intrinsics for fragments, bug?
Mikael Holmén via llvm-dev
llvm-dev at lists.llvm.org
Wed Sep 20 01:43:26 PDT 2017
Hi all,
Thanks for the answers!
I feel like I've hijacked your thread now though Björn, sorry for that.
But from the answers it sounds like there is agreement that it's
reasonable to remove the duplicates as done in Björn's patch?
---
A couple of more things around the problem I saw.
On 09/19/2017 05:40 PM, Adrian Prantl wrote:
> A dbg.declare describes a stack-allocated variable. There may only be
> one dbg.declare per source variable, with the one exception that if
> the source variable is split up into multiple fragments (such as SROA)
> there may be one dbg.declare per variable fragment.
How about this:
%b.sroa.4.i = alloca [32 x i32]
call void @llvm.dbg.declare(metadata [32 x i32]* %b.sroa.4.i,
metadata !10, metadata !DIExpression(DW_OP_LLVM_fragment, 32, 1024)),
!dbg !18
call void @llvm.dbg.declare(metadata [32 x i32]* %b.sroa.4.i,
metadata !10, metadata !DIExpression(DW_OP_LLVM_fragment, 32, 1024)),
!dbg !20
The dbg.declares are identical except that !18 and !20 have different
inlinedAt fields. The above is the result of the alloca-merging done by
the inliner. After inlining two calls to the same function it merges two
allocas and keeps the dbg.declares from each of them.
On 09/19/2017 05:44 PM, Reid Kleckner wrote:
> I think it's a bug in both places: the backend should tolerate
> identical, duplicate dbg.declares, and the loop unroller probably
> shouldn't duplicate dbg.declare, since there is no point.
I also think it's weird that the
replaceDbgDeclareForAlloca/replaceDbgDeclare/FindAllocaDbgDeclare
methods return as soon as they've handled one found dbg.declare, so if
there are several, one is moved next to the alloca, but the other ones
are left somewhere. So maybe a fault there too? These methods are used
from a bunch of different passes...
Thanks,
Mikael
On 09/19/2017 05:46 PM, Adrian Prantl wrote:
>
>> On Sep 19, 2017, at 8:44 AM, Reid Kleckner <rnk at google.com
>> <mailto:rnk at google.com>> wrote:
>>
>> On Tue, Sep 19, 2017 at 8:40 AM, Adrian Prantl via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> > Later loop unroll comes and unrolls the loop and then suddenly we have two absolutely identical dbg.declares and the assert in addFragmentOffset() blows. Who's at fault?
>>
>> Without having read the code yet, my intuition says that the
>> unroller should not be duplicating dbg.declares, only dbg.values.
>>
>>
>> I think it's a bug in both places: the backend should tolerate
>> identical, duplicate dbg.declares,
>
> I guess that's fair, yes.
>
> -- adrian
>
>> and the loop unroller probably shouldn't duplicate dbg.declare, since
>> there is no point.
>>
>> IR is supposed to be duplicatable unless it is marked noduplicate.
>> That was ultimately the fix we applied for PR33157, right?
>
More information about the llvm-dev
mailing list