rjmccall added inline comments.

================
Comment at: cfe/trunk/lib/CodeGen/CGExpr.cpp:4268
+        DestTy.getAddressSpace(), ConvertType(DestTy));
+    return MakeNaturalAlignPointeeAddrLValue(V, DestTy);
+  }
----------------
romanovvlad wrote:
> Hi,
> 
> It seems this code doesn't work correctly(repro at the end). TBAA information 
> is lost here because MakeNaturalAlignPointeeAddrLValue constructs LValue with 
> alignment of poinee type but TBAA info is taken from pointer itself what is 
> strange enough. As a result, for example, memcpy with wrong size is generated 
> for copy constructors. 
> 
> Repro:
> 
> ```
> class P {
> public:
>   P(const P &Rhs) = default;
> 
>   long a;
>   long b;
> };
> 
> __kernel void foo(__global P* GPtr) {
>   P Val = GPtr[0];
> }
> ```
> 
> As a solution the line could be replaced with the following:
> ```
> return MakeAddrLValue(Address(V, LV.getAddress().getAlignment()),
>                                        E->getType(), LV.getBaseInfo(),
>                                        CGM.getTBAAInfoForSubobject(LV, 
> E->getType()));
> ```
> To take all the information from the original pointer.
> 
> What do you think about solution?
> 
Oh, yes, this should absolutely not be using 
`MakeNaturalAlignPointerAddrLValue`; it should be preserving all of the extra 
information from the original l-value, as you say.

I think TBAA information is independent of address-space qualification and can 
just be taken from the original LV directly instead of using 
`getTBAAInfoForSubobject`.


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D53764/new/

https://reviews.llvm.org/D53764



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

Reply via email to