]> granicus.if.org Git - clang/commit
[OpenCL][CodeGen] Fix replacing memcpy with addrspacecast
authorAndrew Savonichev <andrew.savonichev@intel.com>
Mon, 10 Dec 2018 12:03:00 +0000 (12:03 +0000)
committerAndrew Savonichev <andrew.savonichev@intel.com>
Mon, 10 Dec 2018 12:03:00 +0000 (12:03 +0000)
commit453d65eef03dda87e18c04f33b79f8d4e47b2e57
tree3bb73a1627a0826ca14a05d8b5618891b82bfece
parent6a72a16cd26cbbba30598119eb033e6535d1a9ca
[OpenCL][CodeGen] Fix replacing memcpy with addrspacecast

Summary:
If a function argument is byval and RV is located in default or alloca address space
an optimization of creating addrspacecast instead of memcpy is performed. That is
not correct for OpenCL, where that can lead to a situation of address space casting
from __private * to __global *. See an example below:

```
typedef struct {
  int x;
} MyStruct;

void foo(MyStruct val) {}

kernel void KernelOneMember(__global MyStruct* x) {
  foo (*x);
}
```

for this code clang generated following IR:
...
%0 = load %struct.MyStruct addrspace(1)*, %struct.MyStruct addrspace(1)**
%x.addr, align 4
%1 = addrspacecast %struct.MyStruct addrspace(1)* %0 to %struct.MyStruct*
...

So the optimization was disallowed for OpenCL if RV is located in an address space
different than that of the argument (0).

Reviewers: yaxunl, Anastasia

Reviewed By: Anastasia

Subscribers: cfe-commits, asavonic

Differential Revision: https://reviews.llvm.org/D54947

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@348752 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CGCall.cpp
test/CodeGenOpenCL/addr-space-struct-arg.cl