rjmccall added a comment.

In D79378#2028705 <https://reviews.llvm.org/D79378#2028705>, @rsmith wrote:

> In D79378#2019336 <https://reviews.llvm.org/D79378#2019336>, @rjmccall wrote:
>
> > Is it reasonable to figure out ahead of time that we can skip the null 
> > check completely?  It'd be kindof nice to also take advantage of this at 
> > -O0 whenever we don't have real work to do.
>
>
> In simple cases, we could get a win at `-O0` (deleting an object or array 
> with a trivial (and therefore non-virtual) destructor + non-destroying 
> operator delete + no array cookie). Perhaps in those cases we could sidestep 
> the whole process and just generate a direct call to `operator delete`. 
> That's a different optimization from the one I'm suggesting here (which in 
> turn is trying to be the non-miscompiling subset of the original LLVM-side 
> optimization), though there's lots of overlap. If we don't care about the 
> `-Oz` cases where the destructor is non-trivial before optimization but can 
> be removed by the optimizer, then we could do that instead of this change. If 
> we decide we care about both situations (removing the branch at `-O0` for 
> trivial deletes and removing the branch at `-Oz` for deletes that optimize 
> into being trivial deletes), then I think we need both something like this 
> *and* that check.
>
> What do you think? I'm somewhat inclined to prefer special-casing deletes 
> that the frontend can see are trivial, rather than making the delete 
> unconditional under `-Oz`. That means we might see a code size regression in 
> some cases for `-Oz`, but I suspect that's mostly a theoretical risk.
>
> If we do special-case trivial deletes, should we still insert the branch for 
> them at `-O1` and above? In order for that to be profitable, I think the 
> branch would need to be both well-predicted and usually null, which seems 
> like it could happen but is unlikely to be the common case. I suspect the 
> best answer may be to do this regardless of optimization level.


It doesn't have to be *usually* null, just null often enough that it pays for 
itself.  I think that isn't that unlikely given that a lot of deletes are from 
abstracted locations like destructors.

On balance, I think I'm okay with your current approach, as long as we document 
our assumption that skipping the check is not usually a performance win.  I'm 
not too worried about the -O0 cost.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79378/new/

https://reviews.llvm.org/D79378



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D79378: P... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D793... Diogo N. Sampaio via Phabricator via cfe-commits
    • [PATCH] D793... John McCall via Phabricator via cfe-commits
    • [PATCH] D793... Diogo N. Sampaio via Phabricator via cfe-commits
    • [PATCH] D793... Diogo N. Sampaio via Phabricator via cfe-commits

Reply via email to