[LLVMdev] Attaching range metadata to IntrinsicInst
Nick Lewycky
nlewycky at google.com
Tue Jun 17 12:19:57 PDT 2014
On 17 June 2014 06:41, Eli Bendersky <eliben at google.com> wrote:
> On Tue, Jun 17, 2014 at 1:38 AM, Nick Lewycky <nicholas at mxc.ca> wrote:
>
>> Chandler Carruth wrote:
>>
>>> This seems fine to me, but I'd like to make sure it looks OK to Nick as
>>> well.
>>>
>>
>> I strongly prefer baking in knowledge about the intrinsics themselves
>> into the passes if possible. Metadata will always be secondary.
>>
>
> So you're saying that in this particular case you'd prefer LLVM passes to
> know about the range of these PTX intrinsics, rather than Clang adding them
> as metadata?
>
Yep.
ValueTracking.cpp already has some iffy target knowledge (someone sneaked a
> direct Intrinsic::x86_sse42_crc32_64_64 check in there), but extending it
> to other intrinsics in other targets seems like too much...
>
That's not iffy. That's exactly how it should work, and we should have more
of that. There is a major gotcha and that's dealing with the case where the
intrinsics don't exist because the backend wasn't compiled in. If
x86_sse42_crc32_64_64 is in there (and also in instcombine btw), presumably
that problem is solved somehow? Or does llvm actually not build if you
don't enable the x86 target? I feel like we would've heard about that.
Nick
So should target info be passed into it in some way? Any suggestions where
> to put it? TargetLibraryInfo? TargetTransformInfo? In any case this seems
> like the target interface will have to be augmented, and we'll have to
> carry an object around into ValueTracking's compute* functions. If this is
> the right way, then this is the way it will be done - design ideas are
> appreciated.
>
> Eli
>
>
>
>
>>
>> Separately, should value tracking look use range metadata when it's
>> available? Absolutely.
>>
>> I think it should apply to all CallInst not just IntrinsicInst (which is
>> derived from CallInst).
>>
>> Nick
>>
>> On Tue, Jun 17, 2014 at 12:37 AM, Jingyue Wu <jingyue at google.com
>>> <mailto:jingyue at google.com>> wrote:
>>>
>>> Hi,
>>>
>>> The range metadata can only be attached to LoadInst for now. I am
>>> considering extending its usage to IntrinsicInst so that the
>>> frontend can annotate the range of the return value of an intrinsic
>>> call. e.g.,
>>> %a = call i32 @llvm.xxx(), !range !0
>>> !0 = metadata !{ i32 0, i23 1024 }
>>>
>>> The motivation behind this extension is some optimizations we are
>>> working on for CUDA programs. Some special registers in CUDA (e.g.,
>>> threadIdx.x) are bounded per CUDA programming guide, and knowing
>>> their ranges can improve the precision of ValueTracking and benefit
>>> optimizations such as InstCombine.
>>>
>>> To implement this idea, we need ValueTracking to be aware of the
>>> ranges of these special variables. These special registers are so
>>> far read-only and accessed using intrinsics. e.g.,
>>> %threadIdx.x = call i32 @llvm.nvvm.read.ptx.sreg.tid.x().
>>>
>>> One possible approach is to have ValueTracking compute the known
>>> bits of these intrinsics as special cases. This approach is already
>>> taken for the x86_sse42_crc32_64_64 intrinsic. However, this
>>> approach may not be elegant because the ranges of these CUDA special
>>> registers depend on the GPU compute capability specified by
>>> -target-cpu. For instance, blockIdx.x is bounded by 65535 in sm_20
>>> but 2^31-1 in sm_30. Exposing -target-cpu to ValueTracking is
>>> probably discouraged.
>>>
>>> Therefore, the approach I am considering is to have clang annotate
>>> the ranges of these CUDA special registers according to the
>>> -target-cpu flag, and have ValueTracking pick the range metadata for
>>> optimization. By doing so, we hide the target-specific info from
>>> ValueTracking.
>>>
>>> The code change in llvm minus clang won't be large. The core change
>>> is only a few lines:
>>> http://reviews.llvm.org/differential/diff/10464/. If this extension
>>> sounds good to you, I'll definitely add more tests and revise the
>>> documents on range metadata.
>>>
>>> Best,
>>> Jingyue
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu <mailto: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
>>>
>>
>> _______________________________________________
>> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140617/b3eeaf74/attachment.html>
More information about the llvm-dev
mailing list