[LLVMdev] Minimum Array Size
Hal Finkel
hfinkel at anl.gov
Mon Sep 10 21:49:44 PDT 2012
On Mon, 10 Sep 2012 20:35:55 -0700
Nick Lewycky <nicholas at mxc.ca> wrote:
> 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?
Good point. A parameter attribute would make sense; something like
validfor(<n>) with n being the number of bytes (or would it be better
to specify things in terms of sizeof(type))? Your intrinsic suggestions
below is, however, probably better.
>
> 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'm not sure. There are certainly cases when vectorizing where that
might be useful. I have no idea if any of these cases (in real code) are
in function where the parameters are declared like that.
> 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'?
I like that idea; we can start by accepting and ignoring all of the
complicated cases. Something like:
i32 @llvm.pointervalidfor.i32(i8* <object>, i32 <size>)
i64 @llvm.pointervalidfor.i64(i8* <object>, i64 <size>) ?
-Hal
>
> Nick
--
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list