[LLVMdev] Pointer vs Integer classification (was Re: make DataLayout a mandatory part of Module)

Philip Reames listmail at philipreames.com
Mon Feb 24 11:17:19 PST 2014


On 02/24/2014 12:45 AM, Andrew Trick wrote:
>
> On Feb 21, 2014, at 10:37 AM, Philip Reames <listmail at philipreames.com 
> <mailto:listmail at philipreames.com>> wrote:
>
>>
>> On 02/14/2014 05:55 PM, Philip Reames wrote:
>>> Splitting out a conversation which started in "make DataLayout a 
>>> mandatory part of Module" since the topic has decidedly changed.  
>>> This also relates to the email "RFC: GEP as canonical form for 
>>> pointer addressing" I just sent.
>>>
>>> On 02/10/2014 05:25 PM, Nick Lewycky wrote:
>>>> ...
>>>>
>>>> We're supposed to have the llvm.gcroots intrinsic for this purpose, 
>>>> but you note that it prevents gc roots from being in registers 
>>>> (they must be in memory somewhere, usually on the stack), and that 
>>>> fixing it is more work than is reasonable.
>>> This is slightly off, but probably close to what I actually said 
>>> even if not quite what I meant.  :)
>>>
>>> I'm going to skip this and respond with a fuller explanation 
>>> Monday.  I'd written an explanation once, realized it was wrong, and 
>>> decided I should probably revisit when fully awake.
>>>
>>> Fundamentally, I believe that gc.roots could be made to work, even 
>>> with decent (but not optimal) performance in the end.  We may even 
>>> contribute some patches towards fixing issues with the gc.root 
>>> mechanism just to make a fair comparison.  I just don't believe it's 
>>> the right approach or the best way to reach the end goal.
>> So, not quite on Monday, but I did get around to writing up an 
>> explanation of what's wrong with using gcroot.  It turned out to be 
>> much longer than I expected, so I turned it into a blog post:
>> http://www.philipreames.com/Blog/2014/02/21/why-not-use-gcroot/
>>
>> The very short version: gcroot loses roots (for any GC) due to bad 
>> interaction with the optimizer, and gcroot doesn't capture all copies 
>> of a pointer root which fundamentally breaks collectors which 
>> relocate roots.  The only way I know to make gcroot (in its current 
>> form) work reliably for all collectors is to insert safepoints very 
>> early, which has highly negative performance impacts.  There are some 
>> (potentially) cheaper but ugly hacks available if you don't need to 
>> relocate roots.
>>
>> There's also going to be a follow up post on implementation problems, 
>> but that's completely separate from the fundamental problems.
>
> Thanks for the writeup. FWIW my understanding of gcroot has always 
> been that the call to invoke GC is “extern” and not readonly, so we 
> can’t do store->load forwarding on the escaped pointer across it. I 
> have never used gcroot myself.
Andy, I'm not clear what you're trying to say here.  Could you 
rephrase?  In particular, what do you mean by "call to invoke GC"?

Philip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140224/d3201a70/attachment.html>


More information about the llvm-dev mailing list