[LLVMdev] Minimum Array Size

Nick Lewycky nicholas at mxc.ca
Mon Sep 10 20:35:55 PDT 2012


Hal Finkel wrote:
> On Mon, 10 Sep 2012 17:40:43 -0700
> Nick Lewycky<nicholas at mxc.ca>  wrote:
>
>> Hal Finkel wrote:
>>> Hello,
>>>
>>> clang currently seems to generate the same code for both:
>>>
>>> double something_a(char A[const static 256]) {
>>>     ...
>>> }
>>>
>>> and for:
>>>
>>> double something_b(char (*const A)) {
>>>     ...
>>> }
>>>
>>> even though in the first case the programmer has told us that the
>>> array A is at least 256 bytes in length (and, thus, will not be
>>> null). Do we currently have a way to pass this information to LLVM?
>>
>> No, but I'm interested in this. C++ references imply that 'n' bytes
>> of the pointer may be dereferenced, and we have no way of capturing
>> that fact. It would feed into llvm::isSafeToLoadUnconditionally().
>
> At the risk of starting yet another metadata proposal discussion, shall
> we add some metadata to describe this? These cases could be handled by
> metadata with an integer parameter.

How about function attributes?

  Is there a reasonable way of
> handling cases like:
> void foo(int n, int q[n][n]) { ... } ?

Hmm, I hadn't thought of that.

Does that ever give us useful information with which to optimize? I 
don't see how isSafeToLoadUnconditionally could ever answer "yes" if it 
doesn't know what 'n' is at compile time.

I suppose the cases where it's useful would involve a loop-aware (SCEV 
powered?) version of isSafeToLoadUnconditionally where we know that 
we're going through 'i = [0..n)', or where 'n' is solved through other 
optimizations and gets inlined.

What about a new intrinsic indicating that right here (where the 
intrinsic is called) it is safe to load-unconditionally 'n' bytes from 
pointer 'p'?

Nick



More information about the llvm-dev mailing list