[LLVMdev] Clang devirtualization proposal

Philip Reames listmail at philipreames.com
Fri Jul 31 15:53:33 PDT 2015

Ok, replying anew now that I understand why reasoning about abstract 
locations for each object doesn't work.

The general idea of describing a set of load and stores which belong to 
a particular invariant group seems reasonable.  I've got some 
questions/comments on the specifics, but the overall direction seems 
entirely workable for the specific problem you're trying to solve.

Quoting from the google doc: "If we don’t know definition of some 
function, we assume that it will not call @llvm.invariant.group.barrier()."
This part really really bugs me.  We generally try to assume minimal 
knowledge of external functions (i.e. they can do anything) and this 
assumption would invert that.  Is there a way we can rephrase the 
proposal which avoids the need for this?  I'm not quite clear what this 
assumption buys us.

Is there a particular reason why a load or store must belong to a single 
invariant group rather than be a member of several?  I don't have an 
immediate use case in mind, but it seems potentially useful.

"i8* @llvm.invariant.group.barrier(i8*):Given a pointer, produces 
another pointer that aliases the first but which is considered different 
for the purposes of load !invariant.group metadata."
The definition here minorly bugs me.  This might just be a matter of 
wordsmithing, but it seems strange to me that this can't be defined in 
terms of the assumptions allowed about the memory through the two 
pointers.  If I'm looking at this instruction in memory dependence 
analysis, what am I allowed to assume, not assume?  The current 
definition doesn't make this obvious.  One option: "produces another 
pointer which aliases the first, but where any invariant assumptions 
introduced by invariant.group metadata have been striped away."

The notion of using the assume seems to make sense.  I could see an 
argument for extending the invariant.group metadata with a way to 
express the assumed value, but we could also make that extension at a 
later time if needed.

I'm wondering if there's a problematic interaction with CSE here. 
Consider this example is pseudo LLVM IR:
v1 = load i64, %p, !invariant.group !Type1
; I called destructor/placement new for the same type, but that 
optimized entirely away
p2 = invariant.group.barrier(p1)
if (p1 != p2) return.
store i64 0, %p2, !invariant.group !Type1
v2 = load i64, %p2, !invariant.group !Type1
ret i64 v1 - v2

(Assume that !Type is used to describe a write once integer field within 
some class.  Not all instances have the same integer value.)

Having CSE turn this into:
v1 = load i64, %p, !invariant.group !Type1
p2 = invariant.group.barrier(p1)
if (p1 != p2) return.
store i64 0, %p1, !invariant.group !Type1
v2 = load i64, %p1, !invariant.group !Type1
ret i64 v1 - v2

And then GVN turn this into:
v1 = load i64, %p, !invariant.group !Type1
p2 = invariant.group.barrier(p1)
if (p1 != p2) return.
ret i64 v1 - v1 (-> 0)

This doesn't seem like the result I'd expect.  Is there something about 
my initial IR which is wrong/invalid in some way?  Is the 
invariant.group required to be specific to a single bitpattern across 
all usages within a function/module/context?  That would be reasonable, 
but I don't think is explicit said right now.  It also makes 
!invariant.group effectively useless for describing constant fields 
which are constant per instance rather than per-class.


On 07/22/2015 02:55 PM, Piotr Padlewski wrote:
> Hi folks,
> this summer I will work with Richard Smith on clang devirtualization. 
> Check out our proposal:
> https://docs.google.com/document/d/1f2SGa4TIPuBGm6y6YO768GrQsA8awNfGEJSBFukLhYA/edit?usp=sharing 
> <https://urldefense.proofpoint.com/v2/url?u=https-3A__docs.google.com_document_d_1f2SGa4TIPuBGm6y6YO768GrQsA8awNfGEJSBFukLhYA_edit-3Fusp-3Dsharing&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=-sGvXxkjadRLtXcTi4kOVPumoH-0XOKmk_vgUTcYugY&s=hHoo6tgC-NooXdIwbBwT_D8sIw8fcYF4XvBRI8Lr9Eg&e=>
> And modified LangRef
> http://reviews.llvm.org/D11399 
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11399&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=-sGvXxkjadRLtXcTi4kOVPumoH-0XOKmk_vgUTcYugY&s=L6_vdinD06uAwgm4OJGL5QxKw8Tzfa_4DxPwf3Zj704&e=>
> You can also check out previous disscussion that was started before 
> our proposal was ready - 
> http://lists.cs.uiuc.edu/pipermail/cfe-dev/2015-July/044052.html
> Regards
> Piotr Padlewski
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150731/1d73c77c/attachment.html>

More information about the llvm-dev mailing list