[PATCH] D82204: [DSE,MSSA] Treat `store 0` after calloc as noop stores.
Alina Sbirlea via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 23 10:43:13 PDT 2020
asbirlea accepted this revision.
asbirlea added a comment.
This revision is now accepted and ready to land.
lgtm
================
Comment at: llvm/test/Transforms/DeadStoreElimination/MSSA/calloc-store.ll:113
+ store i8 0, i8* %p.2, align 1
+ ret i8* %p
+}
----------------
fhahn wrote:
> asbirlea wrote:
> > fhahn wrote:
> > > asbirlea wrote:
> > > > Negative test: add before ret and check it does not get eliminated:
> > > > ```
> > > > %p.3.2 = getelementptr i8, i8* %p, i32 3
> > > > store i8 0, i8* %p.3.2, align 1
> > > > ```
> > > Done, I've added it as a separate test. Currently only the last store is left over, but as it is a store of 0, it could also be eliminated. We currently don't do that, because of the order in which we perform the eliminations.
> > I was suggesting a test where the store would intentionally not be eliminated (negative test), and this seems correct below. There is a store of 5, then the store of 0 should not be eliminated because it would overwrite the 5.
> > Add a check that the store of value 5 is also there?
> >
> > If you mean the store is the last before ret, and it should be eliminated because of *that*, then add another method call afterwards to defeat it. This way, we'll have a unit test to check that DSE works correctly on the particular feature added in this patch, the pattern:
> > ```
> > calloc
> > store non-zero value
> > store zero is not eliminated (i.e. clobbering correctly find the non-zero store, not the calloc)
> > ```
> >
> > Does this make sense?
> > I was suggesting a test where the store would intentionally not be eliminated (negative test), and this seems correct below. There is a store of 5, then the store of 0 should not be eliminated because it would overwrite the 5.
> > Add a check that the store of value 5 is also there?
> I might be missing something, but `store i8 5, i8* %p.3` in @test11 is eliminated because it gets overwritten by the last store ` store i8 0, i8* %p.3.2`. The check lines ensure that it is gone.
>
>
> >
> > If you mean the store is the last before ret, and it should be eliminated because of *that*, then add another method call afterwards to defeat it.
>
> We are already returning the pointer returned from `calloc`, which should be enough to ensure that non-zero stores cannot be removed because they are not read at the end of the function I think.
>
> This way, we'll have a unit test to check that DSE works correctly on the particular feature added in this patch, the pattern:
> >
> > calloc
> > store non-zero value
> > store zero is not eliminated (i.e. clobbering correctly find the non-zero store, not the calloc)
> > Does this make sense?
>
> IIUC in the scenario above (which is should be reflected in @test11) we could eliminate both stores. The non-zero value is overwritten by 0 before it is read or the function returns, so `calloc` would already ensure the location is zero.
>
> I'll add a test case with a read between the non-zero and zero store. This way, neither can be eliminated.
>
> Does that make sense?
>
>
Yes, that's perfect. You're right, I missed the need for a use inbetween, otherwise the 5 stored also gets eliminated. Thank you for adding this.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D82204/new/
https://reviews.llvm.org/D82204
More information about the llvm-commits
mailing list