[PATCH] D26811: [MemCpyOpt] Don't sink LoadInst below possible clobber.
bryant via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 22 06:12:25 PST 2016
bryant added inline comments.
================
Comment at: lib/Transforms/Scalar/MemCpyOptimizer.cpp:619
if (P && P != SI) {
- if (!moveUp(AA, SI, P))
+ if (!moveUp(AA, SI, P, LI))
P = nullptr;
----------------
bryant wrote:
> efriedma wrote:
> > I'm not really following what this patch is doing. Whether it's legal to sink the load to location P isn't related to whether it's legal to hoist the store to location P.
> >
> > On a side-note, this whole block of code will never run in a normal pass pipeline; "T->isAggregateType()" will never be true because instcombine breaks up aggregate loads and stores.
> > I'm not really following what this patch is doing. Whether it's legal to sink
> > the load to location P isn't related to whether it's legal to hoist the store
> > to location P.
>
> The store isn't necessarily the only thing to be hoisted to P. Instructions that
> the store 1) depends on or 2) aliases also need to be hoisted. That's `moveUp`'s
> job: To figure out which instructions, in addition to the store, need to be
> hoisted.
>
> Once all the hoisting is done, a memcpy/memmove is created to replace the load
> and store. However, this implies sinking the load past the hoisted stuff to just
> before the store, which may not be legal.
>
> So this patch ensures that it's legal for the load to sink past the hoisted
> stuff, even though no explicit sinking is needed.
>
> Does that make sense?
>
> > On a side-note, this whole block of code will never run in a normal pass
> > pipeline; "T->isAggregateType()" will never be true because instcombine
> > breaks up aggregate loads and stores.
>
> InstCombine refrains from exploding aggregate loads and stores when there's
> padding. I've updated the test case accordingly.
>
Here's an example, in case the explanation wasn't clear:
```
%x = load
P ; clobbers the load
X ; clobbers the load and store
store %x
```
MCO will turn this into
```
X ; clobbers the load and store
%x = load
store %x ; merged with the load into a memcpy
P ; clobbers the load
```
which is bad, since the load is moved past X.
Repository:
rL LLVM
https://reviews.llvm.org/D26811
More information about the llvm-commits
mailing list