On 2016/1/22 12:32 AM, Jakub Jelinek wrote:
> On Thu, Jan 21, 2016 at 10:22:19PM +0800, Chung-Lin Tang wrote:
>> On 2016/1/20 09:17 PM, Bernd Schmidt wrote:
>>> On 01/05/2016 02:15 PM, Chung-Lin Tang wrote:
>>>> * omp-low.c (scan_sharing_clauses): Call add_local_decl() for
>>>> use_device/use_device_ptr variables.
>>>
>>> It looks vaguely plausible, but if everything is part of the host
>>> function, why make a copy of the decl at all? I.e. what happens if you
>>> just remove the install_var_local call?
>>
>> Because (only) inside the OpenMP context, the variable is supposed to
>> contain the device-side value; a runtime call is used to obtain the
>> value from the device back to host. So a new variable is created, the
>> remap_decl mechanisms are used to change references inside the omp
>> context, and other references of the original variable are not touched.
>
> The patch looks wrong to me, the var shouldn't be actually used,
> it is supposed to have DECL_VALUE_EXPR set for it during omp lowering and
> the following gimplification is supposed to replace it.
>
> I've tried the testcases you've listed and couldn't get an ICE, so, if you
> see some ICE, can you mail the testcase (in patch form)?
> Perhaps there is something wrong with the OpenACC lowering?
>
> Jakub
>
I've attached a small testcase that triggers the ICE under -fopenacc. This stll
happens under current trunk.
Thanks,
Chung-Lin
void foo (float *x, float *y)
{
int n = 1 << 20;
#pragma acc data create(x[0:n]) copyout(y[0:n])
{
#pragma acc host_data use_device(x,y)
{
for (int i = 1 ; i < n; i++)
y[0] += x[i] * y[i];
}
}
}