aarch64/testsuite: Fix if-compare_2.c for removing vcond{,u,eq} patterns [PR116041]
[official-gcc.git] / libgomp / testsuite / libgomp.c / omp_alloc-6.c
blob13e8747dc3b37117bb140116ec94d0d1b858dd32
1 /* { dg-do run } */
3 /* Test that low-latency realloc and free chains are sound. */
5 #include <stddef.h>
6 #include <omp.h>
8 #pragma omp requires dynamic_allocators
10 void
11 check (int cond, const char *msg)
13 if (!cond)
15 __builtin_printf ("%s\n", msg);
16 __builtin_abort ();
20 int
21 main ()
23 if (omp_get_initial_device () == omp_get_default_device ())
24 return 0; /* This test isn't interesting with host-fallback. */
26 #pragma omp target
28 /* Ensure that the memory we get *is* low-latency with a null-fallback. */
29 omp_alloctrait_t traits[2]
30 = { { omp_atk_fallback, omp_atv_null_fb },
31 { omp_atk_access, omp_atv_cgroup } };
32 omp_allocator_handle_t lowlat = omp_init_allocator (omp_low_lat_mem_space,
33 2, traits);
35 int size = 16;
37 char *a = (char *) omp_alloc (size, lowlat);
38 char *b = (char *) omp_alloc (size, lowlat);
39 char *c = (char *) omp_alloc (size, lowlat);
40 char *d = (char *) omp_alloc (size, lowlat);
42 /* There are headers and padding to account for. */
43 int size2 = size + (b-a);
44 int size3 = size + (c-a);
45 int size4 = size + (d-a) + 100; /* Random larger amount. */
47 check (a != NULL && b != NULL && c != NULL && d != NULL,
48 "omp_alloc returned NULL\n");
50 char *p = omp_realloc (b, size, lowlat, lowlat);
51 check (p == b, "realloc did not reuse same size chunk, no space after");
53 p = omp_realloc (b, size-8, lowlat, lowlat);
54 check (p == b, "realloc did not reuse smaller chunk, no space after");
56 p = omp_realloc (b, size, lowlat, lowlat);
57 check (p == b, "realloc did not reuse original size chunk, no space after");
59 /* Make space after b. */
60 omp_free (c, lowlat);
62 p = omp_realloc (b, size, lowlat, lowlat);
63 check (p == b, "realloc did not reuse same size chunk");
65 p = omp_realloc (b, size-8, lowlat, lowlat);
66 check (p == b, "realloc did not reuse smaller chunk");
68 p = omp_realloc (b, size, lowlat, lowlat);
69 check (p == b, "realloc did not reuse original size chunk");
71 p = omp_realloc (b, size+8, lowlat, lowlat);
72 check (p == b, "realloc did not extend in place by a little");
74 p = omp_realloc (b, size2, lowlat, lowlat);
75 check (p == b, "realloc did not extend into whole next chunk");
77 p = omp_realloc (b, size3, lowlat, lowlat);
78 check (p != b, "realloc did not move b elsewhere");
79 omp_free (p, lowlat);
82 p = omp_realloc (a, size, lowlat, lowlat);
83 check (p == a, "realloc did not reuse same size chunk, first position");
85 p = omp_realloc (a, size-8, lowlat, lowlat);
86 check (p == a, "realloc did not reuse smaller chunk, first position");
88 p = omp_realloc (a, size, lowlat, lowlat);
89 check (p == a, "realloc did not reuse original size chunk, first position");
91 p = omp_realloc (a, size+8, lowlat, lowlat);
92 check (p == a, "realloc did not extend in place by a little, first position");
94 p = omp_realloc (a, size3, lowlat, lowlat);
95 check (p == a, "realloc did not extend into whole next chunk, first position");
97 p = omp_realloc (a, size4, lowlat, lowlat);
98 check (p != a, "realloc did not move a elsewhere, first position");
99 omp_free (p, lowlat);
102 p = omp_realloc (d, size, lowlat, lowlat);
103 check (p == d, "realloc did not reuse same size chunk, last position");
105 p = omp_realloc (d, size-8, lowlat, lowlat);
106 check (p == d, "realloc did not reuse smaller chunk, last position");
108 p = omp_realloc (d, size, lowlat, lowlat);
109 check (p == d, "realloc did not reuse original size chunk, last position");
111 p = omp_realloc (d, size+8, lowlat, lowlat);
112 check (p == d, "realloc did not extend in place by d little, last position");
114 /* Larger than low latency memory. */
115 p = omp_realloc (d, 100000000, lowlat, lowlat);
116 check (p == NULL, "realloc did not fail on OOM");
119 return 0;