rjmccall added inline comments.

================
Comment at: lib/CodeGen/CGExpr.cpp:1286
@@ -1283,1 +1285,3 @@
+    Value = Builder.CreateNoAlias(Value, NAI->second);
+
   if (Ty->isAtomicType() ||
----------------
hfinkel wrote:
> rjmccall wrote:
> > This is very strange.  Why do the aliasing properties of an address cause 
> > metadata to be attached to the value stored into it?  Shouldn't the 
> > metadata be on the address (in which case, perhaps it should have been 
> > attached to the load from the restrict pointer?) or the store?
> > 
> > Also, please find some way to avoid doing a DenseMap lookup on every single 
> > store.  I would guess that the address only has an entry in that table if 
> > it was restrict-qualified; you can probably find a way to pass that 
> > information down.
> > This is very strange. Why do the aliasing properties of an address cause 
> > metadata to be attached to the value stored into it? Shouldn't the metadata 
> > be on the address (in which case, perhaps it should have been attached to 
> > the load from the restrict pointer?) or the store?
> 
> 
> To be clear, this is not the metadata, this is the intrinsic; the metadata 
> needs to be attached to all access in the scope. The intrinsic wraps the 
> 'noalias' address. And this is "wrapping" the restrict-qualified address with 
> the llvm.noalias intrinsic before it is stored into the stack space allocated 
> for the local variable.
> 
> > Also, please find some way to avoid doing a DenseMap lookup on every single 
> > store. I would guess that the address only has an entry in that table if it 
> > was restrict-qualified; you can probably find a way to pass that 
> > information down.
> 
> You are right: some (indirect) caller of this function should see a 
> restrict-qualified variable. Maybe this information should end up in the 
> LValue structure?
> 
> Maybe it is worth now thinking about that should be the follow-on patch, 
> because that also might influence the design. This patch handles direct 
> restrict-qualified local variables, but does not handle the case where the 
> variables are inside a structure. Specifically, I mean this:
> 
>   struct V {
>     double * restrict x;
>     double * restrict y;
>     double * restrict z;
>   };
> 
>   void foo() {
>     V v = { getX(), getY(), getZ() };
>     // The stores that compose this initializer need to be wrapped in 
> @llvm.noalias also.
>   }
> 
> So I'd like to end up with a design for this patch that is easy to extend to 
> handle the restrict-qualified-local-structure-member case as well.
"Value" is the value being stored to the address.

If I've got code like this:
  double * restrict addr = get_addr();
  double value = get_value();
  *addr = value;

you are producing IR like
  %addr = call double* @get_addr()
  %value = call double get_value()
  %value2 = call @llvm.noalias(double %value)
  store %value2, %addr

This is what I'm saying does not make any sense, because there's nothing 
special about %value; the restrictions are on %addr.  I think you probably just 
have a bug in your patch and meant to use Addr.

> You are right: some (indirect) caller of this function should see a 
> restrict-qualified variable. Maybe this information should end up in the 
> LValue structure?

Yes, we already store when l-values are volatile, so storing that they're 
restrict should be easy.


http://reviews.llvm.org/D9403




_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to