| /* { dg-do run } */ |
| /* { dg-require-effective-target omp_usm } */ |
| |
| #include <stdint.h> |
| #include <stdlib.h> |
| |
| #include <omp.h> |
| |
| /* On old systems, the declaraition may not be present in stdlib.h which |
| will generate a warning. This function is going to be replaced with |
| omp_aligned_alloc so the purpose of this declaration is to avoid that |
| warning. */ |
| void *aligned_alloc(size_t alignment, size_t size); |
| |
| #pragma omp requires unified_shared_memory |
| |
| int |
| main () |
| { |
| int *a = (int *) malloc(sizeof(int)*2); |
| int *b = (int *) calloc(sizeof(int), 3); |
| int *c = (int *) realloc(NULL, sizeof(int) * 4); |
| int *d = (int *) aligned_alloc(32, sizeof(int)); |
| int *e = (int *) omp_target_alloc(sizeof(int), 1); |
| if (!a || !b || !c || !d || !e) |
| __builtin_abort (); |
| |
| a[0] = 42; |
| a[1] = 43; |
| b[0] = 52; |
| b[1] = 53; |
| b[2] = 54; |
| c[0] = 62; |
| c[1] = 63; |
| c[2] = 64; |
| c[3] = 65; |
| |
| uintptr_t a_p = (uintptr_t)a; |
| uintptr_t b_p = (uintptr_t)b; |
| uintptr_t c_p = (uintptr_t)c; |
| uintptr_t d_p = (uintptr_t)d; |
| uintptr_t e_p = (uintptr_t)e; |
| |
| if (d_p & 31 != 0) |
| __builtin_abort (); |
| |
| #pragma omp target enter data map(to:a[0:2]) |
| |
| #pragma omp target is_device_ptr(c) |
| { |
| if (a[0] != 42 || a_p != (uintptr_t)a) |
| __builtin_abort (); |
| if (b[0] != 52 || b[2] != 54 || b_p != (uintptr_t)b) |
| __builtin_abort (); |
| if (c[0] != 62 || c[3] != 65 || c_p != (uintptr_t)c) |
| __builtin_abort (); |
| if (d_p != (uintptr_t)d) |
| __builtin_abort (); |
| if (e_p != (uintptr_t)e) |
| __builtin_abort (); |
| a[0] = 72; |
| b[0] = 82; |
| c[0] = 92; |
| e[0] = 102; |
| } |
| |
| #pragma omp target |
| { |
| if (a[1] != 43 || a_p != (uintptr_t)a) |
| __builtin_abort (); |
| if (b[1] != 53 || b_p != (uintptr_t)b) |
| __builtin_abort (); |
| if (c[1] != 63 || c[2] != 64 || c_p != (uintptr_t)c) |
| __builtin_abort (); |
| a[1] = 73; |
| b[1] = 83; |
| c[1] = 93; |
| } |
| |
| #pragma omp target exit data map(delete:a[0:2]) |
| |
| if (a[0] != 72 || a[1] != 73 |
| || b[0] != 82 || b[1] != 83 |
| || c[0] != 92 || c[1] != 93 |
| || e[0] != 102) |
| __builtin_abort (); |
| free(a); |
| free(b); |
| free(c); |
| omp_target_free(e, 1); |
| return 0; |
| } |