rjmccall added inline comments.

================
Comment at: lib/CodeGen/CGCall.cpp:3851
+                                         ->getType()
+                                         ->getPointerAddressSpace();
         const unsigned ArgAddrSpace =
----------------
yaxunl wrote:
> rjmccall wrote:
> > Hmm.  Is there actually a test case where Addr.getType()->getAddressSpace() 
> > is not the lowering of LangAS::Default?  The correctness of the 
> > performAddrSpaceCast call you make depends on that.
> > 
> > If there isn't, I think it would be better to add a target hook to attempt 
> > to peephole an addrspace cast:
> >   llvm::Value *tryPeepholeAddrSpaceCast(llvm::Value*, unsigned valueAS, 
> > unsigned targetAS);
> > 
> > And then you can just do
> >   bool HasAddrSpaceMismatch = CGM.getASTAllocaAddrSpace() != 
> > LangAS::Default);
> >   if (HasAddrSpaceMismatch) {
> >     if (llvm::Value *ptr = tryPeepholeAddrSpaceCast(Addr.getPointer(), 
> > LangAS::Default, getASTAllocAddrSpace())) {
> >       Addr = Address(ptr, Addr.getAlignment()); // might need to cast the 
> > element type for this
> >       HasAddrSpaceMismatch = false;
> >     }
> >   }
> It is possible RVAddrSpace is not default addr space. e.g. in OpenCL
> 
> ```
> global struct S g_s;
> 
> void f(struct S s);
> 
> void g() {
>   f(g_s);
> }
> 
> ```
> 
> One thing that confuses me is that why creating temp and copying can be 
> skipped if RVAddrSpace equals alloca addr space. The callee is supposed to 
> work on a copy of the arg, not the arg itself, right? Shouldn't the arg 
> always be coped to a temp then pass to the callee?
The result of emitting an agg expression should already be a temporary.  All 
sorts of things would be broken if it we still had a direct reference to g_s 
when we got here.


https://reviews.llvm.org/D34367



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

Reply via email to