[PATCH] Prevent MDNode's RAUW from introducing a reference to a void Value.
Duncan P. N. Exon Smith
dexonsmith at apple.com
Thu Oct 16 18:20:30 PDT 2014
> On Oct 16, 2014, at 6:08 PM, Eric Christopher <echristo at gmail.com> wrote:
>
> On Thu, Oct 16, 2014 at 6:06 PM, Duncan P. N. Exon Smith
> <dexonsmith at apple.com> wrote:
>>
>>> On Oct 16, 2014, at 3:54 PM, Frederic Riss <friss at apple.com> wrote:
>>>
>>> If you look at the added testcase, it cast a void (*func)() to a int (*func)(). The int typed result is referenced in a debug info metadata node (an argument to the dbg.value intrinsic). Then instcombine would remove the bitcast and turn the int returning function into a void returning function that gets RAUWd over the value in the MDNode. And at this point in the current code you have invalid IR.
>>>
>>> The code in the testcase is reduced from a huge LTO link that encountered this situation in a much more complicated setup.
>>>
>>> http://reviews.llvm.org/D5828
>>
>> Weird. This LGTM (after fixing a few super minor whitespace changes);
>> not sure if Eric is still looking.
>
> Enh, I was trying to figure out if there was some way to avoid the
> void metadata node being create rather than avoiding RAUW'ing it. It's
> probably not a huge distinction at the moment.
I don't think it is a void metadata node; it's a void `CallInst`.
We have:
call void @llvm.dbg.declare(metadata !{i32* %deadvar}, ...)
%call = ...
store i32 %call, i32* %deadvar, align 4, !dbg !21
Which converts to:
call void @llvm.dbg.value(metadata !{i32* %call}, ...)
%call = ...
Then, when %call gets RAUW'ed, `metadata !{i32* %call}` gets updated
to `void`.
More information about the llvm-commits
mailing list