[llvm-commits] preserve pointer roots in globals
Nick Lewycky
nlewycky at google.com
Thu Jul 19 13:51:28 PDT 2012
On 19 July 2012 12:01, Nuno Lopes <nunoplopes at sapo.pt> wrote:
> Quoting Nick Lewycky <nlewycky at google.com>:
>
> On 11 July 2012 09:50, Nuno Lopes <nunoplopes at sapo.pt> wrote:
>>
>> Quoting Nick Lewycky <nlewycky at google.com>:
>>>
>>> On 30 June 2012 13:52, Nuno Lopes <nunoplopes at sapo.pt> wrote:
>>>
>>>>
>>>> Hi Nick,
>>>>
>>>>>
>>>>> I understand the use case that you and Chandler presented in the other
>>>>> emails, and I believe it's a perfectly valid one!
>>>>> However, I've 2 concerns about this patch:
>>>>> - it seems there's some code duplication between
>>>>> CleanupPointerRootUsers()
>>>>> and CleanupConstantGlobalUsers(). Can't you just single out the couple
>>>>> of
>>>>> cases where the behavior is different?
>>>>>
>>>>>
>>>>> Maybe. They're accomplishing different things and they test different
>>>> conditions along the way. I'll see what I can do.
>>>>
>>>>
>>> The behaviour is now different in every case. :)
>>
>> Updated patch attached!
>>
>
> The patch looks great now! It's interesting to see that it is now able to
> delete a store that was not deleted before.
>
Thanks! It's not deleting a store it previously couldn't, the test change
in 2009-11-16-BrokenPerformHeapAllocSRoA.ll shows us deleting the malloc
call, which previously we didn't try to do (but would ultimately be deleted
anyways).
Just a few minor comments about CleanupPointerRootUsers():
> - The correctness of the handling of memcpy/memmove/memset depends on the
> invariant that the function is only called when the GV is written. I think
> we should have a test to make sure we don't break this invariant in the
> future (or at least drop an assertion there).
> (BTW, I imagine the same invariant is valid in
> CleanupConstantGlobalUsers(), so it can use the same simplification you did
> here)
>
I'm not sure what you mean. What is the invariant?
Also:
>
> + } else if (Constant *C = dyn_cast<Constant>(U)) {
> + if (SafeToDestroyConstant(C)) {
> + C->destroyConstant();
> + // This could have invalidated UI, start over from scratch.
> + Dead.clear();
> + return CleanupPointerRootUsers(GV);
> + }
>
> Here you have to 'return true', there's no escape possible because in the
> second round we may not delete anything and return false.
>
Thanks. Fixed.
Nick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120719/f689b943/attachment.html>
More information about the llvm-commits
mailing list