SANJAY SRIVALLABH SINGAPURAM via llvm-dev
2017-Jun-22 14:29 UTC
[llvm-dev] Legal names for Functions and other Identifiers
Thanks for the heads up Philip !
I did come across a strange case where LLVM allowed "%" to be a part
of a
function's name. This was in the context of my patch
https://reviews.llvm.org/D33985, where I prefix the name of the source
function and the Scop ( A special kind of Region that Polly can optimize,
the name of the Scop is the name of the Region ) to the name of the PTX
kernel generated from the Scop. For e.g. The edits like the following to
<polly_src>/lib/CodeGen/PPCGCodeGeneration.cpp
<https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/lib/CodeGen/PPCGCodeGeneration.cpp#L1422>
achieves the above mentioned prefixing,
@@ -1419,7 +1438,9 @@ void GPUNodeBuilder::createKernel(__isl_take
isl_ast_node *KernelStmt) {
Builder.SetInsertPoint(&HostInsertPoint);
Value *Parameters = createLaunchParameters(Kernel, F, SubtreeValues);
- std::string Name = "kernel_" + std::to_string(Kernel->id);
+ std::string Name = S.getFunction().getName().str() + "_" +
+ S.getOrigName() + "_kernel_" +
+ std::to_string(Kernel->id);
(Where getOrigName returns the name of the Scop before the IRBuilder
modified it)
Produces the effect,
--- a/test/GPGPU/kernel-params-only-some-arrays.ll
<https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/test/GPGPU/kernel-params-only-some-arrays.ll#L19-L20>
+++ b/test/GPGPU/kernel-params-only-some-arrays.ll
@@ -16,12 +16,12 @@
; B[i] += 42;
; }
-; KERNEL: ; ModuleID = 'kernel_0'
-; KERNEL-NEXT: source_filename = "kernel_0"
+; KERNEL: ; ModuleID
'kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0'
+; KERNEL-NEXT: source_filename
"kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0"
I don't understand how Module verification
<https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/lib/CodeGen/PPCGCodeGeneration.cpp#L1813>
was fine with this name. What are your thoughts ?
On Thu, Jun 22, 2017 at 6:14 PM Philip Pfaffe <philip.pfaffe at gmail.com>
wrote:
> Hi Sanjay,
>
> since I've seen you working with GPU code generation, one additional
heads
> up: You must take care that your function names are also legal in the
> target architecture (such as PTX).
>
> While backends can legalize function names, NVPTX can't/doesn't (it
can't,
> really, because kernel invocation can be done by a name string). This means
> that you mustn't have, e.g., a dot in your function name. The dot is
legal
> in an LLVM identifier, but not in a ptx function name. This also is
> noteworthy because the slot tracker automatically inserts dots into
> function names for deduplication.
>
> Best,
> Philip
>
> 2017-06-22 14:34 GMT+02:00 SANJAY SRIVALLABH SINGAPURAM via llvm-dev <
> llvm-dev at lists.llvm.org>:
>
>> Thank You Chen !
>>
>> On Thu, Jun 22, 2017 at 5:21 PM 陳韋任 <chenwj.cs97g at
g2.nctu.edu.tw> wrote:
>>
>>> Perhaps you can refer to [1]. Function name should be a global one.
>>>
>>> [1] http://llvm.org/docs/LangRef.html#identifiers
>>>
>>> HTH,
>>> chenwj
>>>
>>>
>>> 2017-06-22 16:35 GMT+08:00 SANJAY SRIVALLABH SINGAPURAM via
llvm-dev <
>>> llvm-dev at lists.llvm.org>:
>>>
>>>> Hello,
>>>>
>>>> I'd like to know the format a function's name must
conform to. Can I be
>>>> pointed to LLVM documention that specifies the nomenclature for
functions
>>>> and other Identifiers as well (%registers, ModuleID etc.) ?
>>>>
>>>> Thanks,
>>>> Sanjay
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>
>>>>
>>>
>>>
>>> --
>>> Wei-Ren Chen (陳韋任)
>>> Homepage: https://people.cs.nctu.edu.tw/~chenwj
>>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170622/905c9faf/attachment.html>
陳韋任 via llvm-dev
2017-Jun-22 14:37 UTC
[llvm-dev] Legal names for Functions and other Identifiers
> > Produces the effect, > --- a/test/GPGPU/kernel-params-only-some-arrays.ll > <https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/test/GPGPU/kernel-params-only-some-arrays.ll#L19-L20> > +++ b/test/GPGPU/kernel-params-only-some-arrays.ll > @@ -16,12 +16,12 @@ > ; B[i] += 42; > ; } > > -; KERNEL: ; ModuleID = 'kernel_0' > -; KERNEL-NEXT: source_filename = "kernel_0" > +; KERNEL: ; ModuleID = 'kernel_params_only_some_ > arrays_%or.cond---%or.end9_kernel_0' > +; KERNEL-NEXT: source_filename = "kernel_params_only_some_ > arrays_%or.cond---%or.end9_kernel_0" > > I don't understand how Module verification > <https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/lib/CodeGen/PPCGCodeGeneration.cpp#L1813> > was fine with this name. What are your thoughts ? >I think ModuleID and source_filename are just simple string, or they are not? I don't see any function name here. -- Wei-Ren Chen (陳韋任) Homepage: https://people.cs.nctu.edu.tw/~chenwj -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170622/16eacc9a/attachment.html>
SANJAY SRIVALLABH SINGAPURAM via llvm-dev
2017-Jun-22 20:03 UTC
[llvm-dev] Legal names for Functions and other Identifiers
Hello Chen, Here's some context. kernel-params-only-some-arrays.ll is a file used to test Polly's GPU codegeneration feature. I had made changes to Polly to rename the PTX functions it would produce, So these changes had to reflect in this test case as well. Here's the entire diff, --- a/test/GPGPU/kernel-params-only-some-arrays.ll +++ b/test/GPGPU/kernel-params-only-some-arrays.ll @@ -16,12 +16,12 @@ ; B[i] += 42; ; } -; KERNEL: ; ModuleID = 'kernel_0' -; KERNEL-NEXT: source_filename = "kernel_0" +; KERNEL: ; ModuleID 'kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0' +; KERNEL-NEXT: source_filename "kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0" ; KERNEL-NEXT: target datalayout "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64" ; KERNEL-NEXT: target triple = "nvptx64-nvidia-cuda" -; KERNEL: define ptx_kernel void @kernel_0(i8 addrspace(1)* %MemRef_A) +; KERNEL: define ptx_kernel void @kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0(i8 addrspace(1)* %MemRef_A) ; KERNEL-NEXT: entry: ; KERNEL-NEXT: %0 = call i32 @llvm.nvvm.read.ptx.sreg.ctaid.x() ; KERNEL-NEXT: %b0 = zext i32 %0 to i64 @@ -31,12 +31,12 @@ ; KERNEL: ret void ; KERNEL-NEXT: } -; KERNEL: ; ModuleID = 'kernel_1' -; KERNEL-NEXT: source_filename = "kernel_1" +; KERNEL: ; ModuleID 'kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_1' +; KERNEL-NEXT: source_filename "kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_1" ; KERNEL-NEXT: target datalayout "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64" ; KERNEL-NEXT: target triple = "nvptx64-nvidia-cuda" -; KERNEL: define ptx_kernel void @kernel_1(i8 addrspace(1)* %MemRef_B) +; KERNEL: define ptx_kernel void @kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_1(i8 addrspace(1)* %MemRef_B) ; KERNEL-NEXT: entry: ; KERNEL-NEXT: %0 = call i32 @llvm.nvvm.read.ptx.sreg.ctaid.x() ; KERNEL-NEXT: %b0 = zext i32 %0 to i64 I couldn't understand how "%" was actually a part of the name of a function. The module was also passed to verifyModule here <https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/lib/CodeGen/PPCGCodeGeneration.cpp#L1813>, which puzzles me even more. On Thu, Jun 22, 2017 at 8:07 PM 陳韋任 <chenwj.cs97g at g2.nctu.edu.tw> wrote:> Produces the effect, >> --- a/test/GPGPU/kernel-params-only-some-arrays.ll >> <https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/test/GPGPU/kernel-params-only-some-arrays.ll#L19-L20> >> +++ b/test/GPGPU/kernel-params-only-some-arrays.ll >> @@ -16,12 +16,12 @@ >> ; B[i] += 42; >> ; } >> >> -; KERNEL: ; ModuleID = 'kernel_0' >> -; KERNEL-NEXT: source_filename = "kernel_0" >> +; KERNEL: ; ModuleID >> 'kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0' >> +; KERNEL-NEXT: source_filename >> "kernel_params_only_some_arrays_%or.cond---%or.end9_kernel_0" >> >> I don't understand how Module verification >> <https://github.com/llvm-mirror/polly/blob/6b8cb877c2fa3ee0e626cac5811115a9c5c71b5b/lib/CodeGen/PPCGCodeGeneration.cpp#L1813> >> was fine with this name. What are your thoughts ? >> > > I think ModuleID and source_filename are just simple string, or they are > not? I don't see any function name here. > > -- > Wei-Ren Chen (陳韋任) > Homepage: https://people.cs.nctu.edu.tw/~chenwj >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170622/ef2660da/attachment.html>