[CUDA][HIP] Fix capturing reference to host variable
authorYaxun (Sam) Liu <yaxun.liu@amd.com>
Tue, 3 Nov 2020 20:24:41 +0000 (15:24 -0500)
committerYaxun (Sam) Liu <yaxun.liu@amd.com>
Wed, 2 Dec 2020 15:14:46 +0000 (10:14 -0500)
commitcd95338ee3022bffd658e52cd3eb9419b4c218ca
tree91abb24f0a580309cbaa272cf29b8ebf0f764028
parenta7e2c2693997e26912787f231543221f8487e0e5
[CUDA][HIP] Fix capturing reference to host variable

In C++ when a reference variable is captured by copy, the lambda
is supposed to make a copy of the referenced variable in the captures
and refer to the copy in the lambda. Therefore, it is valid to capture
a reference to a host global variable in a device lambda since the
device lambda will refer to the copy of the host global variable instead
of access the host global variable directly.

However, clang tries to avoid capturing of reference to a host global variable
if it determines the use of the reference variable in the lambda function is
not odr-use. Clang also tries to emit load of the reference to a global variable
as load of the global variable if it determines that the reference variable is
a compile-time constant.

For a device lambda to capture a reference variable to host global variable
and use the captured value, clang needs to be taught that in such cases the use of the reference
variable is odr-use and the reference variable is not compile-time constant.

This patch fixes that.

Differential Revision: https://reviews.llvm.org/D91088
clang/lib/CodeGen/CGExpr.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/CodeGenCUDA/lambda-reference-var.cu [new file with mode: 0644]