<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/119317>119317</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLVM OpenMP Offload]: Offload fails if I use a function pointer inside a for loop and try to offload the for loop.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vidsinghal
</td>
</tr>
</table>
<pre>
In this example code, I use a function pointer inside the for loop body and try to offload it but it fails with the following error.
```
AMDGPU fatal error 1: Memory access fault by GPU 4 (agent 0x5555556435e0) at virtual address 0x555555555000. Reasons: Unknown (0)
Aborted (core dumped)
```
```
#include <stdio.h>
#include <omp.h>
#include <chrono>
#include <iostream>
#include <cassert>
void for_each(int *array, int size, int (*operation)(int));
int complex(int i);
int main() {
int size = 1e8;
int *array = (int*) malloc(sizeof(int) * size);
int val = 100000;
for(int i = 0; i < size; i++){
array[i] = val;
}
int (*func_ptr)(int) = complex;
auto start = std::chrono::high_resolution_clock::now();
for_each(array, size, func_ptr);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> duration = end - start;
std::cout << "Execution time: " << duration.count() << " seconds" << std::endl;
long sum = 0;
for (long i = 0; i < size; i++){
assert(array[i] == complex(val) && "Element value not correct.");
sum += array[i];
}
std::cout << "Sum: " << sum << std::endl;
}
int complex(int i){
int j = 10;
j = j * 1;
j = j + 1;
j = j * 10;
j = j / 4;
j = j + 1;
for(int i = 0; i < 10000; i++){
j = j * i;
}
return j;
}
void for_each(int *array, int size, int (*func_ptr)(int)){
#pragma omp target teams distribute parallel for map(tofrom: array[0:size])
for(int i = 0; i < (size/5000); i++){
for(int j = 0; j < 5000; j++){
array[i*5000 + j] = func_ptr(array[i*5000 + j]);
}
}
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVl-PozYQ_zTOy-giMCEhD3kgm0110q3u1Or6unLwEJwzNvKf7G4_fWUDCbebXNWqCAnb45n5-TczZpi14qgQNyTfknw3Y9412mzOgluhjg2Ts4Pmb5vPClwjLOArazuJUGmOhD7AZ_AWgUHtVeWEVtBpoRwaEMoKjuAahFobkFp3ECwBUxyceQOnQde11IyDcHDwLnxqJqSFF-GaQVNK_SLUEdAYbeZAkjK8y2R4k7J82v327TvUzDHZ74KUZCU8YavNG7CqQmuhZl46OLxB2LsAQgt2ROUgec3js1xkOSaEroE5OAvjPJPAODdBedyU53mSJHP4HZnVygYv39UPpV9UMBi0A56DNg55WKm0QeC-7ZD3sinu91OaCVVJzxFI9mAdF3rekOzxg0i33W1B1Rit9C2J0NYZZO1NLWYtGjeIkvKsBQ8Be0ZWNYQWQjkgtGTGsLcQ7zC34i8cx4QWhJa6Q8NC-MM5o1IcrEm2JUkZ9lU6pM3rYFFcZIO4ZUJFU2sgq2EdLs6AZDtIsehVAKagomz0WQYDLZNSV4QWQVXXFzxBZcC-nlo6M9k7SMJzgQWBhhFv3BBkcfjQmwkzQrfxXfewoX96uvKtIPkuqp6ZHF2S1W56vp7AUD7PnTNT_qLiyNsVFfNOg3XMuLjBOk6ykmTlGP8wbsSxeTZotfQhKs-V1NWPXqT0S0_01eQk3Jc4jzGeAnuHARX_vxDctsH9kFTZA9f-IJFkjzAuRtcBwqeejJHeqyXtA0MPIVyE0sdXrCIUcKLFULuE0lE-Gp1X2gfu-0S86ILFSituJxoXN6i4nBxEanUE69tLwoyZFAIdhf82l2Co0DE416ya5gctQorFJF8Suownlthin98eQelQhMZg5eaE0kkN9E_ETLfB5tTPx6y9R_Afvn3Hak_DL-gK72j3_j1xuQ_Cymko1QFXPz3F0k4_rG1vrJW3lPewuK88lMi9qyAdbo1b8Zu6FYOH6YnD3KDzRsHpysq44b_dxbeukimNk5gTmnWGHVsGuu3AMXNEBw5Za4EL64w4eIfQMcOkRBmzuGUdoYXTtdEx3GOuJCQrI5Z81__rRh-_YG64ogndh_9qn5F3q-AnU6erqVM0lQ8xOL3XvuYyLcOmGNjTeC1fuSrubvxQKTBWw8-h7MfjL33GNxlfZ2s2w026yrIiSYsinzWbNFmkq4Rn-YLyQ7VCxhbrepUVWb0u0qrGmdjQhC5SmiZJUMvnh0VasCUul3zFEprUZJFgy4ScS3lu59ocZ8Jaj5s0XWfpaibZAaWN7RylCl8gSkPJ57uZ2QSlTwd_tGSRSGGdvZpxwsnYB3758ucTfO1QPX2Dr32PFq-CcpwNfZqo_7H_Y9fu70bjN-0O5zNv5KZxrgudFaF7QvdH4Rp_mFe6JXQfcA6fT53RJ6wcoft4Okvofjj-eUP_DgAA___CuxIs">