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>