llvm-project/openmp/libomptarget/test/offloading/atomic-compare-signedness.c
Johannes Doerfert 7f7e1749c5 [OpenMP] Be smarter about the insertion point for deduplication
We can use dominance and avoid the special handling of kernels and
prevent inserting code before allocas accidentally (as happend in the
runtime test).
2023-03-27 21:30:23 -07:00

48 lines
1.4 KiB
C

// Check that omp atomic compare handles signedness of integer comparisons
// correctly.
//
// At one time, a bug sometimes reversed the signedness.
// RUN: %libomptarget-compile-generic -fopenmp-version=51
// RUN: %libomptarget-run-generic | %fcheck-generic
// RUN: %libomptarget-compileopt-generic -fopenmp-version=51
// RUN: %libomptarget-run-generic | %fcheck-generic
// High parallelism increases our chances of detecting a lack of atomicity.
#define NUM_THREADS_TRY 256
#include <limits.h>
#include <omp.h>
#include <stdio.h>
int main() {
// CHECK: signed: num_threads=[[#NUM_THREADS:]]{{$}}
// CHECK-NEXT: signed: xs=[[#NUM_THREADS-1]]{{$}}
int xs = -1;
int numThreads;
#pragma omp target parallel for num_threads(NUM_THREADS_TRY) \
map(tofrom : xs, numThreads)
for (int i = 0; i < omp_get_num_threads(); ++i) {
#pragma omp atomic compare
if (xs < i) {
xs = i;
}
if (i == 0)
numThreads = omp_get_num_threads();
}
printf("signed: num_threads=%d\n", numThreads);
printf("signed: xs=%d\n", xs);
// CHECK-NEXT: unsigned: xu=0x0{{$}}
unsigned xu = UINT_MAX;
#pragma omp target parallel for num_threads(NUM_THREADS_TRY) map(tofrom : xu)
for (int i = 0; i < omp_get_num_threads(); ++i) {
#pragma omp atomic compare
if (xu > i) {
xu = i;
}
}
printf("unsigned: xu=0x%x\n", xu);
return 0;
}