pxli168 added inline comments.

================
Comment at: include/clang/Basic/Builtins.def:1260
@@ +1259,3 @@
+
+LANGBUILTIN(reserve_read_pipe, "i.", "tn", OCLC_LANG)
+LANGBUILTIN(reserve_write_pipe, "i.", "tn", OCLC_LANG)
----------------
Anastasia wrote:
> Ok, this way it means variable number of arg which isn't right either. But I 
> see some other builtins do the same.
> 
> I think a better approach would be to add pipe as a modifier and a way to 
> represent any gentype in builtins declarations here to be able to specify a 
> signature properly. Although it seems it won't be used for anything but 
> documentation purposes.
> 
> Also adding the overloaded variant for read/write_pipes explicitly might be a 
> good idea (similar to sync_fetch_and_add).
> 
> But I see that not all builtins follow this approach, so it's up to you.
I think this maybe OK for a def file, the parameter is strictly checked in 
Sema. 

================
Comment at: lib/CodeGen/CGBuiltin.cpp:2033
@@ +2032,3 @@
+          *Arg1 = EmitScalarExpr(E->getArg(1));
+    llvm::Type *ReservedIDTy = ConvertType(getContext().OCLReserveIDTy);
+
----------------
pekka.jaaskelainen wrote:
> Anastasia wrote:
> > pekka.jaaskelainen wrote:
> > > Anastasia wrote:
> > > > Why do we need to modify user defined functions? Only builtins will 
> > > > have this extra parameter.
> > > > 
> > > > I think packet size would be useful for builtin implementation to know 
> > > > the number of bytes to be read/written. I don't see how to implement it 
> > > > correctly otherwise. As mentioned earlier relying on the metadata is 
> > > > not a conventional compilation approach and should be avoided if 
> > > > possible.
> > > The pipe struct can have the packet size in its header before the actual 
> > > ring buffer or whatever, which can be used as a fallback unless the 
> > > compiler can optimize it to a larger access. Correct implementation thus 
> > > doesn't require a "hidden parameter". Adding it as a compile time hidden 
> > > constant argument should help the optimizers, that's of course true, but 
> > > I don't think it's strictly required.
> > > 
> > > If you think having a special behavior for the built-ins calls isn't 
> > > problematic, then fine, I'm not having so strong opinion on this.
> > So where would this size be initialized/set? Note that host code might have 
> > different type sizes.
> > 
> > I am thinking that having a size parameter makes the generated function 
> > more generic since we lose information about the type here and recovering 
> > it might involve extra steps. I am currently not clear about how to do that.
> https://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/clCreatePipe.html 
> sets the packet size in creation. We have a prototype implementation working 
> using that. But that generic software version uses a byte loop which is 
> painfully slow, which of course should be optimized to wide loads/stores 
> whenever possible.
> 
> If we want to optimize it, it means inlining the builtin call and then 
> deriving the size for the loop at the compile time after which it can be 
> vectorized (assuming the packet fifo is aligned). Where this size constant 
> comes from is the question under discussion -- you propose having it as an 
> additional hidden parameter to the calls and I propose a metadata. Yours 
> optimizes automatically but requires special casing (when calling a builtin, 
> not user function, add this magic parameter), mine requires a new 
> optimization that takes the MD in account and converts it to a constant after 
> inlining the built-in.
> 
> I'm open for both as I do not really know how much trouble the special casing 
> will bring and I appreciate that optimizations might just work, but in my 
> understanding the size info is strictly not required, but very useful for 
> optimization.
> I am thinking that having a size parameter makes the generated function more 
> generic since we lose information about the type here and recovering it might 
> involve extra steps. I am currently not clear about how to do that.

I know what Anastasia is worried about, but actually I should say that you can 
simply create a pass for the pipe function that get this information for the 
metadata, you can use MDNode to get these information pretty easy. That is what 
I am doing now.


================
Comment at: lib/Sema/SemaChecking.cpp:291
@@ +290,3 @@
+  bool isValid = true;
+  // TODO: For all pipe built-in read is for read_only?
+  bool ReadOnly = getFunctionName(Call).find("read") != StringRef::npos;
----------------
Anastasia wrote:
> I agree the spec doesn't require that checking but I think it's just being 
> imprecise in the description. If you are in doubt you can raise a bug with 
> Khronos to clarify. This might result in additional latency.
> 
> I think it makes sense though to check all of them.
I will keep it here then, and we can change it once the Khronos have some 
feeback.

================
Comment at: test/SemaOpenCL/invalid-pipe-builtin-cl2.0.cl:4
@@ +3,3 @@
+void test(read_only pipe int p, global int* ptr){
+  int tmp;
+  read_pipe(tmp, p);    // expected-error {{first argument to read_pipe must 
be a pipe type}}
----------------
Anastasia wrote:
> I think we need to test all the builtins!
Should we test the negative case for all of the builtin? There are for group of 
cases and I think maybe just 4 groups with read/write that touches all of the 
cases maybe enough.


http://reviews.llvm.org/D15914



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to