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