xref: /llvm-project/openmp/runtime/test/critical/omp_critical_with_hint.c (revision 047890bc3f922e9ffdc5210577d14a4de63ed944)
195cefacfSHansang Bae // RUN: %libomp-compile-and-run
2*047890bcSJoachim Protze // critial with hint was introduced with icc 19
3*047890bcSJoachim Protze // UNSUPPORTED: icc-18
4*047890bcSJoachim Protze 
595cefacfSHansang Bae #include <stdio.h>
695cefacfSHansang Bae #include <omp.h>
795cefacfSHansang Bae #include "omp_testsuite.h"
895cefacfSHansang Bae 
test_omp_critical(int iter)995cefacfSHansang Bae int test_omp_critical(int iter) {
1095cefacfSHansang Bae   int sum;
1195cefacfSHansang Bae   int known_sum;
1295cefacfSHansang Bae 
1395cefacfSHansang Bae   sum = 0;
1495cefacfSHansang Bae #pragma omp parallel
1595cefacfSHansang Bae   {
1695cefacfSHansang Bae     int mysum = 0;
1795cefacfSHansang Bae     int i;
1895cefacfSHansang Bae #pragma omp for
1995cefacfSHansang Bae     for (i = 0; i < 1000; i++)
2095cefacfSHansang Bae       mysum = mysum + i;
2195cefacfSHansang Bae 
2295cefacfSHansang Bae     switch (iter % 4) {
2395cefacfSHansang Bae     case 0:
2495cefacfSHansang Bae #pragma omp critical(c0) hint(omp_sync_hint_uncontended)
2595cefacfSHansang Bae       sum = mysum + sum;
2695cefacfSHansang Bae       break;
2795cefacfSHansang Bae     case 1:
2895cefacfSHansang Bae #pragma omp critical(c1) hint(omp_sync_hint_contended)
2995cefacfSHansang Bae       sum = mysum + sum;
3095cefacfSHansang Bae       break;
3195cefacfSHansang Bae     case 2:
3295cefacfSHansang Bae #pragma omp critical(c2) hint(omp_sync_hint_nonspeculative)
3395cefacfSHansang Bae       sum = mysum + sum;
3495cefacfSHansang Bae       break;
3595cefacfSHansang Bae     case 3:
3695cefacfSHansang Bae #pragma omp critical(c3) hint(omp_sync_hint_speculative)
3795cefacfSHansang Bae       sum = mysum + sum;
3895cefacfSHansang Bae       break;
3995cefacfSHansang Bae     default:;
4095cefacfSHansang Bae     }
4195cefacfSHansang Bae   }
4295cefacfSHansang Bae   known_sum = 999 * 1000 / 2;
4395cefacfSHansang Bae   return (known_sum == sum);
4495cefacfSHansang Bae }
4595cefacfSHansang Bae 
main()4695cefacfSHansang Bae int main() {
4795cefacfSHansang Bae   int i;
4895cefacfSHansang Bae   int num_failed = 0;
4995cefacfSHansang Bae 
5095cefacfSHansang Bae   for (i = 0; i < 4 * REPETITIONS; i++) {
5195cefacfSHansang Bae     if (!test_omp_critical(i)) {
5295cefacfSHansang Bae       num_failed++;
5395cefacfSHansang Bae     }
5495cefacfSHansang Bae   }
5595cefacfSHansang Bae   return num_failed;
5695cefacfSHansang Bae }
57