From: Tom de Vries Date: Thu, 14 Sep 2017 21:15:40 +0000 (+0000) Subject: Introduce libgomp/testsuite/libgomp.c-c++-common X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=82419efbbfcf537f890b9095fdccc1ac44b9ef34;p=gcc.git Introduce libgomp/testsuite/libgomp.c-c++-common 2017-09-14 Tom de Vries * testsuite/libgomp.c++/cancel-taskgroup-1.C: Remove. * testsuite/libgomp.c/cancel-taskgroup-1.c: Move to ... * testsuite/libgomp.c-c++-common/cancel-taskgroup-1.c: ... here. * testsuite/libgomp.c/c.exp: Include test-cases from libgomp.c-c++-common. * testsuite/libgomp.c++/c++.exp: Same. Force c++-mode compilation of .c files. From-SVN: r252775 --- diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 459dcffa570..9fafd622b60 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,13 @@ +2017-09-14 Tom de Vries + + * testsuite/libgomp.c++/cancel-taskgroup-1.C: Remove. + * testsuite/libgomp.c/cancel-taskgroup-1.c: Move to ... + * testsuite/libgomp.c-c++-common/cancel-taskgroup-1.c: ... here. + * testsuite/libgomp.c/c.exp: Include test-cases from + libgomp.c-c++-common. + * testsuite/libgomp.c++/c++.exp: Same. Force c++-mode compilation of .c + files. + 2017-09-14 Jakub Jelinek PR c++/81314 diff --git a/libgomp/testsuite/libgomp.c++/c++.exp b/libgomp/testsuite/libgomp.c++/c++.exp index 0454f95588e..f4884e2ffa7 100644 --- a/libgomp/testsuite/libgomp.c++/c++.exp +++ b/libgomp/testsuite/libgomp.c++/c++.exp @@ -22,6 +22,11 @@ dg-init # Turn on OpenMP. lappend ALWAYS_CFLAGS "additional_flags=-fopenmp" +# Switch into C++ mode. Otherwise, the libgomp.c-c++-common/*.c +# files would be compiled as C files. +set SAVE_GCC_UNDER_TEST "$GCC_UNDER_TEST" +set GCC_UNDER_TEST "$GCC_UNDER_TEST -x c++" + set blddir [lookfor_file [get_multilibs] libgomp] @@ -47,7 +52,9 @@ if { $blddir != "" } { if { $lang_test_file_found } { # Gather a list of all tests. - set tests [lsort [find $srcdir/$subdir *.C]] + set tests [lsort [concat \ + [find $srcdir/$subdir *.C] \ + [find $srcdir/$subdir/../libgomp.c-c++-common *.c]]] if { $blddir != "" } { set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}" @@ -68,5 +75,8 @@ if { $lang_test_file_found } { dg-runtest $tests "" "$libstdcxx_includes $DEFAULT_CFLAGS" } +# See above. +set GCC_UNDER_TEST "$SAVE_GCC_UNDER_TEST" + # All done. dg-finish diff --git a/libgomp/testsuite/libgomp.c++/cancel-taskgroup-1.C b/libgomp/testsuite/libgomp.c++/cancel-taskgroup-1.C deleted file mode 100644 index 4f66859d171..00000000000 --- a/libgomp/testsuite/libgomp.c++/cancel-taskgroup-1.C +++ /dev/null @@ -1,4 +0,0 @@ -// { dg-do run } -// { dg-set-target-env-var OMP_CANCELLATION "true" } - -#include "../libgomp.c/cancel-taskgroup-1.c" diff --git a/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-1.c b/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-1.c new file mode 100644 index 00000000000..5a808113fb0 --- /dev/null +++ b/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-1.c @@ -0,0 +1,70 @@ +/* { dg-do run } */ +/* { dg-set-target-env-var OMP_CANCELLATION "true" } */ + +#include +#include + +struct T { struct T *children[2]; int val; }; + +struct T * +search (struct T *tree, int val, int lvl) +{ + if (tree == NULL || tree->val == val) + return tree; + struct T *ret = NULL; + int i; + for (i = 0; i < 2; i++) + #pragma omp task shared(ret) if(lvl < 10) + { + struct T *r = search (tree->children[i], val, lvl + 1); + if (r) + { + #pragma omp atomic write + ret = r; + #pragma omp cancel taskgroup + } + } + #pragma omp taskwait + return ret; +} + +struct T * +searchp (struct T *tree, int val) +{ + struct T *ret; + #pragma omp parallel shared(ret) firstprivate (tree, val) + #pragma omp single + #pragma omp taskgroup + ret = search (tree, val, 0); + return ret; +} + +int +main () +{ + /* Must be power of two minus 1. */ + int size = 0x7ffff; + struct T *trees = (struct T *) malloc (size * sizeof (struct T)); + if (trees == NULL) + return 0; + int i, l = 1, b = 0; + for (i = 0; i < size; i++) + { + if (i == l) + { + b = l; + l = l * 2 + 1; + } + trees[i].val = i; + trees[i].children[0] = l == size ? NULL : &trees[l + (i - b) * 2]; + trees[i].children[1] = l == size ? NULL : &trees[l + (i - b) * 2 + 1]; + } + for (i = 0; i < 50; i++) + { + int v = random () & size; + if (searchp (&trees[0], v) != &trees[v]) + abort (); + } + free (trees); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/c.exp b/libgomp/testsuite/libgomp.c/c.exp index 300b9211f6d..31bdd5795dc 100644 --- a/libgomp/testsuite/libgomp.c/c.exp +++ b/libgomp/testsuite/libgomp.c/c.exp @@ -24,7 +24,9 @@ dg-init lappend ALWAYS_CFLAGS "additional_flags=-fopenmp" # Gather a list of all tests. -set tests [lsort [find $srcdir/$subdir *.c]] +set tests [lsort [concat \ + [find $srcdir/$subdir *.c] \ + [find $srcdir/$subdir/../libgomp.c-c++-common *.c]]] set ld_library_path $always_ld_library_path append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST] diff --git a/libgomp/testsuite/libgomp.c/cancel-taskgroup-1.c b/libgomp/testsuite/libgomp.c/cancel-taskgroup-1.c deleted file mode 100644 index 5a808113fb0..00000000000 --- a/libgomp/testsuite/libgomp.c/cancel-taskgroup-1.c +++ /dev/null @@ -1,70 +0,0 @@ -/* { dg-do run } */ -/* { dg-set-target-env-var OMP_CANCELLATION "true" } */ - -#include -#include - -struct T { struct T *children[2]; int val; }; - -struct T * -search (struct T *tree, int val, int lvl) -{ - if (tree == NULL || tree->val == val) - return tree; - struct T *ret = NULL; - int i; - for (i = 0; i < 2; i++) - #pragma omp task shared(ret) if(lvl < 10) - { - struct T *r = search (tree->children[i], val, lvl + 1); - if (r) - { - #pragma omp atomic write - ret = r; - #pragma omp cancel taskgroup - } - } - #pragma omp taskwait - return ret; -} - -struct T * -searchp (struct T *tree, int val) -{ - struct T *ret; - #pragma omp parallel shared(ret) firstprivate (tree, val) - #pragma omp single - #pragma omp taskgroup - ret = search (tree, val, 0); - return ret; -} - -int -main () -{ - /* Must be power of two minus 1. */ - int size = 0x7ffff; - struct T *trees = (struct T *) malloc (size * sizeof (struct T)); - if (trees == NULL) - return 0; - int i, l = 1, b = 0; - for (i = 0; i < size; i++) - { - if (i == l) - { - b = l; - l = l * 2 + 1; - } - trees[i].val = i; - trees[i].children[0] = l == size ? NULL : &trees[l + (i - b) * 2]; - trees[i].children[1] = l == size ? NULL : &trees[l + (i - b) * 2 + 1]; - } - for (i = 0; i < 50; i++) - { - int v = random () & size; - if (searchp (&trees[0], v) != &trees[v]) - abort (); - } - free (trees); - return 0; -}