Add a pass to convert aggregate loads/stores into scalar load stores

Philip Reames listmail at philipreames.com
Thu Oct 30 14:08:09 PDT 2014


On 10/28/2014 09:27 AM, Chandler Carruth wrote:
>
> On Tue, Oct 28, 2014 at 6:55 AM, Hal Finkel <hfinkel at anl.gov 
> <mailto:hfinkel at anl.gov>> wrote:
>
>     Chandler,
>
>     Can you please look at this? How do you think we should
>     canonicalize this (is this the right approach)?
>
>
> Oof... yea.
>
> I wish I were more confident of what the "right" answer is here any 
> more. =[
At the dev conference, Hal and I talked about a couple of options. I'm 
sure which is the "right" one, so let me lay out what I remember of that 
discussion.

Option 1 - Leave the load alone, improve GVN
- not necessarily a bad option, but slightly risky in that it involves 
changes to key infrastructure with little in tree motivation
- the original change doing this was rejected

Option 2 - Transform to load of component element types
- tricky to get layout exactly right, but definitely doable

Option 3 - Transform to load of iN where N is sizeof(agg)*8.

Option 4 - Transform to series of smaller integer loads
- This appears to be what this patch implements.  Not entirely sure why 
this was chosen.

Option 5 - Transform to alloca and memcpy
- Clang appears to emit loads of structs via an alloca (for the local) 
and a memcpy.  The optimizer deconstructs this where appropriate.
- I have no idea why Clang chose this option.  My best guess is to 
exploit information about POD types?

Personally, I'd lean towards 5,1,2 above (in roughly that order).  1 & 2 
seem like better long term solutions, but 5 probably works fairly well 
today.  I'm not really a fan of either 3 or 4 since we loose things like 
distinctions between pointers and integers.  If we had to choose, I'd 
take 3 over 4.

I think we also discussed the trade off between a pass and an 
instcombine transform.  I would lean towards making whichever option we 
chose a canonicalization rule in instcombine.

Also, this patch implements option 2 for a struct with a single element 
type which seems like a (independently) useful canonicalization.  Should 
we introduce that transform as a canonicalization in instcombine?  I'd 
lean towards that.

Chandler, Hal - Thoughts, opinions?


>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141030/a7edeb49/attachment.html>


More information about the llvm-commits mailing list