romanovvlad added inline comments.

================
Comment at: cfe/trunk/lib/CodeGen/CGExpr.cpp:4268
+        DestTy.getAddressSpace(), ConvertType(DestTy));
+    return MakeNaturalAlignPointeeAddrLValue(V, DestTy);
+  }
----------------
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?



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