[LLVMdev] A create-distinct-item function with no (other) side effects
Nick Lewycky
nicholas at mxc.ca
Sat Aug 29 00:34:30 PDT 2009
Kenneth Uildriks wrote:
> On Fri, Aug 28, 2009 at 3:47 PM, Nick Lewycky<nlewycky at google.com> wrote:
>>
>> 2009/8/28 Kenneth Uildriks <kennethuil at gmail.com>
>>> This is by design, of course, (CreateDistinctItem does not return the
>>> same value given the same caller-visible global state) but I see no
>>> way to declare a function that:
>>>
>>> 1. Returns a distinct item each time it's called,
>> Attach a 'noalias' attribute to the return type in your function
>> declaration. See http://llvm.org/docs/LangRef.html#paramattrs
>>
>>> 2. Doesn't need to be called at all if its return value from that call
>>> isn't used, and
>>> 3. Doesn't even need to be declared if its return value is *never* used.
>> Thus far these still need a custom pass. It shouldn't be too hard though.
>> See http://wiki.llvm.org/HowTo:_Find_all_call_sites_of_a_function
>>
>> You're the second user I know of to ask for this. We should probably come up
>> with a general solution of some sort.
>
> Conceptually, it's the same as "readonly" except that the requirement
> that it return the same value each time is dropped. It would also
> help optimize away calls to "random" in some cases. I understand that
> adding a new function attribute to IR is not trivial, though. Thanks
> for the confirmation.
Are you sure? What if you had a malloc which lets you view the number of
bytes allocated thus far? Presumably, you don't even know the
implementation of the allocator that CreateDistinctItem is calling and
whether it might expose functions that other LLVM methods can see. What
if the allocator was compiled to bitcode and LLVM sees the pointers it
stores as just flat pointers?
What you've got is a case where the state appears to be entirely private
to this function and you happen to know (or, you believe) that there
isn't any way for your program to get at its private state.
At work, not only do we have a custom allocator, it supports pluggable
extensions. And we've got programs that use them.
We want something a little more advanced than a simple function
attribute. There's a set of functions which can directly see the same
state (malloc's privates, or random's entropy pool) and nobody off of
that whitelist can. At the moment, there's no way to write an
AliasAnalysis which expresses that.
> My front-end is writing LLVM calls into the output module, and JITting
> it as part of the compile process so it can create runtime code, and
> allowing compiled code to optionally call functions exposing those
> same LLVM calls to do its own runtime JITting. I'm finding lots of
> uses for that setup, at both compiletime and runtime, but when the
> compiled code doesn't actually JIT anything at runtime, optimizing
> away all those LLVM calls along with the LLVM library extern function
> declarations would make the resulting .s files have *much* lighter
> linking requirements and be easier to package and distribute. I guess
> a custom pass that's part of my compiler project would be the way to
> go.
Unused extern function declarations can be optimized away with the
-strip-dead-prototypes pass.
Nick
>> Nick
>>
>>> If I happen to know about CreateDistinctItem at build time, I can
>>> write a custom pass, of course, but I was wondering if there was an
>>> easier way to get the standard optimizers to recognize it, or if y'all
>>> think it's worthwhile to add an easier way.
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
More information about the llvm-dev
mailing list