From 03be2d2bb3b4450edfcb83ed047bf1f3ac3cf390 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 30 Jul 2019 09:28:22 +0200 Subject: [PATCH] re PR middle-end/91216 (OpenMP ICE starting with r265930) PR middle-end/91216 * omp-low.c (global_nonaddressable_vars): New variable. (use_pointer_for_field): For global decls, if they are non-addressable, remember it in the global_nonaddressable_vars bitmap, if they are addressable and in the global_nonaddressable_vars bitmap, ignore their TREE_ADDRESSABLE bit. (omp_copy_decl_2): Clear TREE_ADDRESSABLE also on private copies of vars in global_nonaddressable_vars bitmap. (execute_lower_omp): Free global_nonaddressable_vars bitmap. * gcc.dg/gomp/pr91216.c: New test. From-SVN: r273898 --- gcc/ChangeLog | 10 ++++++++++ gcc/omp-low.c | 29 ++++++++++++++++++++++++++--- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/gomp/pr91216.c | 20 ++++++++++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gomp/pr91216.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 030c5897568..f69542dc536 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,15 @@ 2019-07-30 Jakub Jelinek + PR middle-end/91216 + * omp-low.c (global_nonaddressable_vars): New variable. + (use_pointer_for_field): For global decls, if they are non-addressable, + remember it in the global_nonaddressable_vars bitmap, if they are + addressable and in the global_nonaddressable_vars bitmap, ignore their + TREE_ADDRESSABLE bit. + (omp_copy_decl_2): Clear TREE_ADDRESSABLE also on private copies of + vars in global_nonaddressable_vars bitmap. + (execute_lower_omp): Free global_nonaddressable_vars bitmap. + PR target/91150 * config/i386/i386-expand.c (expand_vec_perm_blend): Change mask type from unsigned to unsigned HOST_WIDE_INT. For E_V64QImode cast diff --git a/gcc/omp-low.c b/gcc/omp-low.c index d8756c02ced..5d1b88c76ed 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -162,6 +162,7 @@ static splay_tree all_contexts; static int taskreg_nesting_level; static int target_nesting_level; static bitmap task_shared_vars; +static bitmap global_nonaddressable_vars; static vec taskreg_contexts; static void scan_omp (gimple_seq *, omp_context *); @@ -426,7 +427,26 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) /* Do not use copy-in/copy-out for variables that have their address taken. */ - if (TREE_ADDRESSABLE (decl)) + if (is_global_var (decl)) + { + /* For file scope vars, track whether we've seen them as + non-addressable initially and in that case, keep the same + answer for the duration of the pass, even when they are made + addressable later on e.g. through reduction expansion. Global + variables which weren't addressable before the pass will not + have their privatized copies address taken. See PR91216. */ + if (!TREE_ADDRESSABLE (decl)) + { + if (!global_nonaddressable_vars) + global_nonaddressable_vars = BITMAP_ALLOC (NULL); + bitmap_set_bit (global_nonaddressable_vars, DECL_UID (decl)); + } + else if (!global_nonaddressable_vars + || !bitmap_bit_p (global_nonaddressable_vars, + DECL_UID (decl))) + return true; + } + else if (TREE_ADDRESSABLE (decl)) return true; /* lower_send_shared_vars only uses copy-in, but not copy-out @@ -504,8 +524,10 @@ omp_copy_decl_2 (tree var, tree name, tree type, omp_context *ctx) it's address. But we don't need to take address of privatizations from that var. */ if (TREE_ADDRESSABLE (var) - && task_shared_vars - && bitmap_bit_p (task_shared_vars, DECL_UID (var))) + && ((task_shared_vars + && bitmap_bit_p (task_shared_vars, DECL_UID (var))) + || (global_nonaddressable_vars + && bitmap_bit_p (global_nonaddressable_vars, DECL_UID (var))))) TREE_ADDRESSABLE (copy) = 0; ctx->block_vars = copy; @@ -12730,6 +12752,7 @@ execute_lower_omp (void) all_contexts = NULL; } BITMAP_FREE (task_shared_vars); + BITMAP_FREE (global_nonaddressable_vars); /* If current function is a method, remove artificial dummy VAR_DECL created for non-static data member privatization, they aren't needed for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 650e436ce2b..2a4893779d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-07-30 Jakub Jelinek + PR middle-end/91216 + * gcc.dg/gomp/pr91216.c: New test. + PR target/91150 * gcc.target/i386/avx512bw-pr91150.c: New test. diff --git a/gcc/testsuite/gcc.dg/gomp/pr91216.c b/gcc/testsuite/gcc.dg/gomp/pr91216.c new file mode 100644 index 00000000000..3fcc1355568 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr91216.c @@ -0,0 +1,20 @@ +/* PR middle-end/91216 */ + +int r; + +void +foo (int *a) +{ + int i; + #pragma omp for reduction(+:r) + for (i = 0; i < 64; i++) + a[i] = i; + #pragma omp for private (r) + for (i = 0; i < 64; i++) + { + r = 0; + #pragma omp parallel shared(r) + #pragma omp master + r = r + 1; + } +} -- 2.30.2