Optimize load from aggregate stores
deadal nix
deadalnix at gmail.com
Wed Jun 25 12:05:41 PDT 2014
Hi Hal,
If you think some other design is more appropriate, I'd be happy to update
the diff.
2014-06-25 4:34 GMT-07:00 Hal Finkel <hfinkel at anl.gov>:
> Hi deadal,
>
> + // When facing an Aggregate, we have to find the element to fetch from.
> + while (SrcVal->getType()->isAggregateType()) {
> + if (StructType *ST = dyn_cast<StructType>(SrcVal->getType())) {
> + const StructLayout &Layout = *DL.getStructLayout(ST);
> + unsigned i = 0;
> + for (unsigned cd = 0, e = ST->getNumElements(); cd != e; ++cd) {
> + if (Layout.getElementOffset(cd) > Offset) break;
> + i = cd;
> + }
> +
> + SrcVal = Builder.CreateExtractValue(SrcVal, i);
> + Offset -= Layout.getElementOffset(i);
>
> What happens if Offset goes beyond the end of the struct?
>
>
I was trusting the alias analysis to not feed me this, but that I true that
i should add a check, let me provide an updated diff to make sure we don't
go off road on that one. However, I'm not sure what a good test case for
this would look like.
> @@ -1919,6 +1938,11 @@ bool GVN::processLoad(LoadInst *L) {
> if (DL) {
> StoredVal = CoerceAvailableValueToLoadType(StoredVal,
> L->getType(),
> L, *DL);
> + if (!StoredVal) {
> + // In case of aggregate store, we may have to fallback to
> GetStoreValueForLoad.
> + StoredVal = GetStoreValueForLoad(DepSI->getValueOperand(), 0,
> L->getType(), L, *DL);
> + }
> +
> if (!StoredVal)
> return false;
>
> I'm a bit concerned here that we're changing the logic for things other
> than the aggregate case. CoerceAvailableValueToLoadType can return false
> for all sorts of reasons.
>
>
As said, if you think there is a better way to do this, i'd be happy to
update the diff.
> Owen, while I'm also concerned about code coverage here, I see no
> technical reason to discourage this: I don't see why we should force all
> frontends to adopt the Clang method, which involves lots of bitcasts and
> memcpys. This is a much larger semantic restriction than "put your allocas
> in the entry block."
>
> Chandler, could you please look at this? Is this something that SROA
> should be dealing with first?
>
> -Hal
>
> ----- Original Message -----
> > From: "deadal nix" <deadalnix at gmail.com>
> > To: "Owen Anderson" <owen at apple.com>
> > Cc: llvm-commits at cs.uiuc.edu
> > Sent: Tuesday, June 24, 2014 6:02:14 PM
> > Subject: Re: Optimize load from aggregate stores
> >
> >
> >
> > ping ?
> >
> >
> >
> >
> > 2014-06-13 13:30 GMT-07:00 deadal nix < deadalnix at gmail.com > :
> >
> >
> >
> >
> >
> >
> >
> >
> > 2014-06-12 9:25 GMT-07:00 Owen Anderson < owen at apple.com > :
> >
> >
> >
> >
> >
> >
> >
> >
> > On Jun 12, 2014, at 9:02 AM, Philip Reames <
> > listmail at philipreames.com > wrote:
> >
> >
> >
> >
> > On 06/12/2014 12:28 AM, Owen Anderson wrote:
> >
> >
> >
> >
> >
> > On Jun 11, 2014, at 11:29 PM, deadal nix < deadalnix at gmail.com >
> > wrote:
> >
> >
> > It is gonna improve the situation quite a lot for all frontend that
> > use aggregate loads (arguably, that is a bad practice, but that no
> > reason to stab people in the back when they do it anyway).
> >
> >
> > I'm not sure I agree with that statement. If we don't think they
> > should be used, not optimizing them is a good way to discourage
> > that. More generally, I'm concerned about how we will ever get good
> > test coverage of this code path, since we don't have any extant
> > front ends that hit it. I'm joining this discussion late, but a) why
> > are aggregate loads bad practice? Loading something like a small
> > struct from memory with a single load seems reasonable.
> >
> >
> > They are not well supported through the code generator, and
> > introducing them would add a lot of complexity. There are better
> > solutions already in use. The only encouraged use case for first
> > class structs is as multiple return values.
> >
> >
> >
> >
> > Refusing a patches to improve support because something is not well
> > supported is the best way to ensure they are never well supported.
> >
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140625/c71a96d7/attachment.html>
More information about the llvm-commits
mailing list